在析构函数中尝试Catch块

Try Catch block in destructor

本文关键字:Catch 析构函数      更新时间:2023-10-16

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

有人能解释一下吗?

我的理解是,这不是一个好主意。因为,如果在堆栈展开期间由于异常而调用T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。

try - catch块的存在正是为了防止这种情况。代码:

try
{
    Close();
}
catch( ... ) { }

将捕获Close抛出的任何异常并忽略它们。因此析构函数不会抛出任何可能导致调用终止函数的异常。

除非catch允许异常逃逸,否则Close是否可以抛出并不重要。

通常catch子句被设计成永远不会抛出

事实上,没有catch子句会引入你所描述的问题。

关于析构函数中catch的有趣文章:

https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/