7
异常处理与错误返回
Exceptions · noexcept · expected
C 里靠返回值/错误码处理错误,调用者稍不留神就忘了检查。C++ 用 try/catch/throw:出错了就"抛"出去,没人接就一直往上冒泡。现代 C++23 还提供了 std::expected,介于"异常"和"错误码"之间。
try / catch / throw
#include <stdexcept>
#include <iostream>
double divide(double a, double b) {
if (b == 0)
throw std::runtime_error("除数不能为零"); // 抛出异常
return a / b;
}
int main() {
try {
std::cout << divide(10, 0) << "\n";
} catch (const std::exception& e) { // 接住异常
std::cerr << "出错了:" << e.what() << "\n";
}
}
运行结果
出错了:除数不能为零
论异常 vs 错误码 vs expected
异常:适合"真的没想到、出大事"的错误,不强制调用者处理。但有运行开销,且要注意"异常安全"(抛异常时资源别泄漏——好在有 RAII)。
noexcept(C++11):声明函数不会抛异常,编译器可优化。标错了会直接 terminate。
std::expected(C++23):函数要么返回正确值、要么返回错误,调用者必须显式处理。结合了错误码的可控和类型安全,是现代趋势。