C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C/C++错误处理

C/C++中函数分装时错误处理的常见方法

作者:何曾参静谧

在 C++ 中处理错误信息时,通常有几种常见的方式,具体选择取决于你的需求、代码风格和项目规范,以下是几种常见的处理方式,希望对大家有所帮助

1. 使用返回值(错误码)

适用于简单函数,尤其是性能敏感的场景。

// 返回 0 表示成功,非 0 表示错误码
int ComputeSomething(int input, double& output) {
    if (input < 0) {
        return 1; // 错误码 1:非法输入
    }
    output = sqrt(input);
    return 0; // 成功
}

// 调用示例:
double result;
int err = ComputeSomething(-1, result);
if (err != 0) {
    std::cerr << "Error: " << err << std::endl;
    // 处理错误...
}

优点:

缺点:

2. 使用 std::optional 或 std::expected(C++23)

适用于可能失败但不需要详细错误信息的函数。

#include <optional>
#include <cmath>

std::optional<double> SafeSqrt(double x) {
    if (x < 0) {
        return std::nullopt; // 表示失败
    }
    return sqrt(x);
}

// 调用示例:
auto result = SafeSqrt(-1);
if (!result) {
    std::cerr << "Error: Invalid input" << std::endl;
    // 处理错误...
}

优点:

缺点:

无法携带详细的错误信息(只能表示成功/失败)。

3. 抛出异常(throw)

适用于严重错误或不可恢复的错误。

#include <stdexcept>

double ComputeSomething(int input) {
    if (input < 0) {
        throw std::invalid_argument("Input must be non-negative");
    }
    return sqrt(input);
}

// 调用示例:
try {
    double result = ComputeSomething(-1);
} catch (const std::exception& e) {
    std::cerr << "Error: " << e.what() << std::endl;
    // 处理错误...
}

优点:

缺点:

4. 使用自定义错误结构(结构化错误)

适用于需要返回复杂错误信息的场景。

#include <string>
#include <variant>

// 定义可能的错误类型
struct Error {
    int code;
    std::string message;
};

// 使用 std::variant 表示可能成功或失败
template <typename T>
using Result = std::variant<T, Error>;

Result<double> SafeDivide(double a, double b) {
    if (b == 0) {
        return Error{1, "Division by zero"};
    }
    return a / b;
}

// 调用示例:
auto result = SafeDivide(1, 0);
if (std::holds_alternative<Error>(result)) {
    auto err = std::get<Error>(result);
    std::cerr << "Error " << err.code << ": " << err.message << std::endl;
    // 处理错误...
}

优点:

缺点:

5. 使用日志记录(Logging)

适用于调试或非关键错误。

#include <iostream>

bool ComputeSomething(int input, double& output) {
    if (input < 0) {
        std::cerr << "[ERROR] Input must be non-negative" << std::endl;
        return false;
    }
    output = sqrt(input);
    return true;
}

// 调用示例:
double result;
if (!ComputeSomething(-1, result)) {
    // 错误已打印,无需额外处理
}

优点:

简单直接,适合调试。

缺点:

错误处理不够灵活(日志可能被忽略)。

最佳实践建议

你的选择应该基于:

到此这篇关于C/C++中函数分装时错误处理的常见方法的文章就介绍到这了,更多相关C/C++错误处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文