楼层: 首页/ 软件技术/ 现代 C++/ 异常处理与错误返回
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):函数要么返回正确值、要么返回错误,调用者必须显式处理。结合了错误码的可控和类型安全,是现代趋势。