要点:不要在析构函数中抛出异常。
Mayers举了一个Widgets vector例子:如果第一个元素的析构函数中抛出了异常,为了避免资源泄漏等问题,其他元素也需要析构,假设第二个元素的析构函数又抛出一个异常。C++无法同时处理两个异常,将导致未知行为甚至程序终止。
补充一个例子:函数执行中抛出异常,退出该函数前将析构所有局部对象。如果在析构局部对象时又抛出异常,也将面对同时处理两个异常的问题。
解决方案是:不要在析构函数中抛出异常。
接着又举了在数据库连接类的析构函数中,关闭数据库连接可能抛出异常的情况。有两种Mayers认为不够好的处理方式:
1) 发生异常时退出程序,显然不够好
2) catch异常并忽略它。这个方案不够好的原因是,它吞掉了“系统发生了错误”这个重要信息。
较好的解决方案是:提供关闭操作函数,让调用者来处理异常。考虑到用户可能忘了调用关闭函数,所以在析构函数中检查连接,如果未关闭则关闭。