在析构函数中尝试Catch块

时间:2015-07-17 20:02:19

标签: c++ exception destructor

在阅读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()。

有人可以对此有所了解。提前谢谢。

3 个答案:

答案 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/