在析构函数中尝试Catch块

Sam*_*Sam 5 c++ destructor exception

在阅读Hurb Sutter的"More Exceptional C++"时,我偶然发现了以下代码:

// Example 19-5: Alternative right solution
//
T::Close()
{
  // ... code that could throw ...
}

T::~T() /* throw() */
{
  try
  {
    Close();
  }
  catch( ... ) { }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sho*_*hoe 7

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

try- catch块,这正是防止.代码:

try
{
    Close();
}
catch( ... ) { }
Run Code Online (Sandbox Code Playgroud)

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


Guv*_*nte 6

这不要紧,如果Close可以抛出,除非catch让例外逃脱.

通常,该catch子句旨在永不抛出.

事实上,没有该catch条款会引入您所描述的问题.