错误处理
异常
std::exception
是标准库中所有异常的基类。stdexcept
头文件中定义了很多生成exception的方法,例如logic_error
。如果要自定义异常,最好也派生自std::exception
。C++ 既不提供也不需要 finally
块来确保在引发异常时释放所有资源,而是借助RAII。
C++使用try-catch来处理异常,如果未找到可用的 catch 块,则调用 std::terminate
并且程序会退出。
如果一个函数不会产生异常,最好使用noexcept
规范。
异常安全和RAII
要实现异常安全状态,函数必须确保销毁其使用 malloc
或 new
分配的对象以及关闭或释放所有资源(如文件句柄),即使引发异常时也是如此。
资源获取即初始化 (RAII) 是一种思想,将资源和变量的生命周期绑定,变量初始化时获取资源,变量结束生命周期时释放资源。在C++中,主要是依赖构造函数和析构函数的实现。
当函数超出范围时,正常返回或因为异常,调用所有完全构造的自动变量的析构函数。 RAII 包装器对象(如智能指针)将在其析构函数中调用合适的 delete 或 close 函数。