跳转至

错误处理

异常

std::exception标准库中所有异常的基类stdexcept头文件中定义了很多生成exception的方法,例如logic_error。如果要自定义异常,最好也派生自std::exception。C++ 既不提供也不需要 finally 块来确保在引发异常时释放所有资源,而是借助RAII。

C++使用try-catch来处理异常,如果未找到可用的 catch 块,则调用 std::terminate 并且程序会退出。

如果一个函数不会产生异常,最好使用noexcept规范。

void MyFunction(int i) noexcept;

异常安全和RAII

要实现异常安全状态,函数必须确保销毁其使用 mallocnew 分配的对象以及关闭或释放所有资源(如文件句柄),即使引发异常时也是如此。

资源获取即初始化 (RAII) 是一种思想,将资源和变量的生命周期绑定,变量初始化时获取资源,变量结束生命周期时释放资源。在C++中,主要是依赖构造函数和析构函数的实现。

当函数超出范围时,正常返回或因为异常,调用所有完全构造的自动变量的析构函数。 RAII 包装器对象(如智能指针)将在其析构函数中调用合适的 delete 或 close 函数。

参考链接

现代 C++ 处理异常和错误的最佳做法 | Microsoft Learn