Mic*_*key 3 c++ destructor exception-handling exception constructor-exception
我有以下代码:
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A::A()" << endl;}
~A() { cout << "A::~A()" << endl; throw "A::exception";}
};
class B {
public:
B() { cout << "B::B()" << endl; throw "B::exception";}
~B() { cout << "B::~B()";}
};
int main() {
try {
cout << "Entering try...catch block" << endl;
A objectA;
B objectB;
cout << "Exiting try...catch block" << endl;
} catch (char const * ex) {
cout << ex << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,在陈述问题之前,我想指出这段代码是不好的做法(例如,从构造函数中抛出异常会导致对象没有被完全创建,因此析构函数将不会被调用,并且可能导致内存泄漏或其他问题).
现在,主要的顺序是这样的:
印刷"Entering try...catch block".
调用A构造函数,打印"A::A()"
调用B构造函数,打印"B::B()"并抛出异常.
抛出异常,"Exiting try...catch block" 不会打印该行.该块退出,因此A调用析构函数.
A析构函数打印"A::~A()"并抛出另一个异常.
第二个异常(在5中)导致main在进入catch块之前抛出异常.
我的问题是-有没有办法赶上主的第二个例外,在不改变类A,B?
我试图用另一个块包围整个try-catch块和块内部,但这不起作用.catchtry-catch
谢谢.
与任何其他函数一样,析构函数可以通过抛出异常终止[...]但是如果在堆栈展开期间恰好调用此析构函数,
std::terminate则会调用它.
因此,抛出异常的尝试~A()不会导致抛出第二个异常; 它导致程序被终止.如果您需要"捕获"此"第二个异常",则需要干扰终止处理程序.或者你可以找到一种不在析构函数中抛出异常的方法.继续cppreference.com:
虽然
std::uncaught_exception有时可能会用于检测正在进行的堆栈展开,但通常认为允许任何析构函数通过抛出异常来终止是不好的做法.
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |