|
类可帮助确保其自己的异常安全,方式为防止自身进行部分构造或部分销毁,即使它由不安全的函数使用也是如此。 如果类构造函数在完成之前就存在,则绝不会创建对象,并且绝不会调用其析构函数。 虽然在异常之前已初始化的自动变量将调用其析构函数,但智能指针或类似自动变量未管理的自动分配的内存或资源将泄漏。
内置类型均是无故障的,标准库类型支持最低级别的基本保证。 为必须是异常安全的任何用户定义类型遵循这些准则:
使用智能指针或其他 RAII 类型的包装器管理所有资源。 在类析构函数中避免资源管理功能,因为如果构造函数引发异常,则将不会调用析构函数。 但是,如果类是仅控制一个资源的专用资源管理器,则可接受使用析构函数管理资源。
了解无法在派生类构造函数中吞并基类构造函数中引发的异常。 如果要转换并再次引发派生构造函数中的基类异常,请使用 try 函数块。
考虑是否将所有类状态存储在包装在一个智能指针中的数据成员中,尤其是在类具有“允许初始化失败”概念时。虽然 C++ 允许未初始化的数据成员,但它不支持未初始化或部分初始化的类实例。 构造函数必须成功或失败;如果构造函数未完成运行,则将不会创建任何对象。
不允许任何异常从析构函数转义。 C++ 的基本原理是,析构函数绝不会允许异常传播到调用堆栈。 如果析构函数必须执行潜在引发异常的操作,则它必须使用 try catch 块如此做并吞并异常。 标准库将为其定义的所有析构函数提供此保证。
|
|