More Effective C++ (Clause 11: prohibits exceptions from exiting destructors)
发布时间
阅读量:
阅读量
1、
在两种情形下,destructor会被触发执行:
(1) 当对象按照常规流程被销毁,即当其超出作用域范围或被显式地删除;
(2) 当对象因异常处理机制——具体而言是异常传播过程中的栈展开(stack-unwinding)操作——而被销毁。
2、
在destructor被调用时,可能存在(也可能不存在)一个正在处理的异常,但无法直接在destructor内部判断当前是否处于异常处理状态(目前已有区分方法。1995年7月,IOS/ANSI C++ 标准委员会引入了一个新的函数:uncaught_exception。若当前存在尚未被捕获的异常,则该函数返回true)。如果destructor中抛出的异常未被其内部捕获,该异常将传递至调用destructor的位置。若此时destructor是因为另一个异常而被调用,则会触发terminate函数,导致程序终止运行,并且不会等待局部对象完成销毁操作,默认情况下会通过调用abort函数结束程序。
3.
针对上述情况存在一种解决方案,可防止destructor中抛出的异常传播到其外部:
将destructor的函数体包裹在一个try块内,并使用catch(...)语句捕获所有可能的异常,但不进行任何处理。
示例代码如下:
~A(){
try{
...//被省略代码
全部评论 (0)
还没有任何评论哟~
