在阅读Hurb Sutter的“More Exceptional C ++”时,我偶然发现了以下代码:
// Example 19-5: Alternative right solution
//
T::Close()
{
// ... code that could throw ...
}
T::~T() /* throw() */
{
try
{
Close();
}
catch( ... ) { }
}
我的理解是,这不是一个好主意。因为,如果由于异常而在堆栈展开期间调用T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。
有人可以对此有所了解。提前谢谢。
答案 0 :(得分:7)
我的理解是,这不是一个好主意。因为,如果由于异常而在堆栈展开期间调用T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。
try
- catch
块正好可以防止这种情况发生。代码:
try
{
Close();
}
catch( ... ) { }
将捕获Close
抛出的任何异常并忽略它们。因此,析构函数不会抛出任何异常,这可能导致调用终止函数。
答案 1 :(得分:6)
除非Close
允许异常逃脱,否则catch
可以抛出并不重要。
通常catch
子句设计为永不抛出。
事实上,没有catch
子句会引入您所描述的问题。
答案 2 :(得分:0)
关于析构函数中catch的一篇文章:
https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/