1
void MyClass::method()
{
 SomeObject a;
 methodThatCanThrowException();
}

我希望捕获调用堆栈更高的异常,而不是在method()- 但在这个例子中,SomeObject析构函数是否会被调用?

4

2 回答 2

4

是的。这就是 RAII 起作用的原因。这就是异常起作用的原因。否则他们不会。

完整标准报价:

15.2 构造函数和析构函数 [except.ctor]
1.当控制从 throw 表达式传递到处理程序时,自进入 try 块以来构造的所有自动对象都会调用析构函数。自动对象按照其构建完成的相反顺序被销毁。
2.任何存储持续时间的对象,如果其初始化或销毁被异常终止,将为其所有完全构造的子对象(不包括类联合类的变体成员)执行析构函数,也就是说,对于主构造函数 ( 12.6.2) 已完成执行,而析构函数尚未开始执行。类似地,如果对象的非委托构造函数已完成执行,并且该对象的委托构造函数因异常退出,则将调用对象的析构函数。如果对象是在 new 表达式中分配的,则调用匹配的释放函数(3.7.4.2、5.3.4、12.5)(如果有)以释放对象占用的存储空间。
3.为在从 try 块到 throw 表达式的路径上构造的自动对象调用析构函数的过程称为“堆栈展开”。如果在堆栈展开期间调用的析构函数以异常退出,则调用 std::terminate (15.5.1)。[注意:所以析构函数通常应该捕获异常,而不是让它们传播到析构函数之外。——尾注]

于 2013-06-12T08:49:02.753 回答
3

是的。有时称为堆栈展开 捕获堆栈更高的异常通常是一个好主意。我已经看到很多代码在无能为力时捕获异常。只要确保SomeObject' 的析构函数不会引发异常。

于 2013-06-12T08:56:41.147 回答