在析构函数中尝试Catch块
Try Catch block in 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()。
有人能解释一下吗?
我的理解是,这不是一个好主意。因为,如果在堆栈展开期间由于异常而调用T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。
try
- catch
块的存在正是为了防止这种情况。代码:
try
{
Close();
}
catch( ... ) { }
将捕获Close
抛出的任何异常并忽略它们。因此析构函数不会抛出任何可能导致调用终止函数的异常。
除非catch
允许异常逃逸,否则Close
是否可以抛出并不重要。
通常catch
子句被设计成永远不会抛出
事实上,没有catch
子句会引入你所描述的问题。
关于析构函数中catch的有趣文章:
https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- std::current_exception 是否应该从类析构函数中的 catch 块返回非空值
- 在析构函数中尝试Catch块
- 析构函数中引发异常的Catch块