我的意思是获得stack unwinding
的一些知识并遇到this page,它通过以下示例进行演示。
#include <iostream>
using namespace std;
struct E {
const char* message;
E(const char* arg) : message(arg) { }
};
void my_terminate() {
cout << "Call to my_terminate" << endl;
};
struct A {
A() { cout << "In constructor of A" << endl; }
~A() {
cout << "In destructor of A" << endl;
throw E("Exception thrown in ~A()");
}
};
struct B {
B() { cout << "In constructor of B" << endl; }
~B() { cout << "In destructor of B" << endl; }
};
int main() {
set_terminate(my_terminate);
try {
cout << "In try block" << endl;
A a;
B b;
throw("Exception thrown in try block of main()");
}
catch (const char* e) {
cout << "Exception: " << e << endl;
}
catch (...) {
cout << "Some exception caught in main()" << endl;
}
cout << "Resume execution of main()" << endl;
}
但是当我使用 g ++ / * clang ++ *编译时它被转储了核心。输出如下:
In try block
In constructor of A
In constructor of B
In destructor of B
In destructor of A
Call to my_terminate
已放弃 (核心已转储) #core dump
有人能给我一些提示吗?
答案 0 :(得分:2)
答案是你在抛出异常时抛出异常。
在main()
中,构造一个A实例。然后你抛出一个异常。 在之前,它被捕获,A::~A
被调用,也引发异常。同时在飞行中有两个例外导致terminate()
(或用户提供的等价物)被调用(默认情况下,调用abort(),这会丢弃一个核心。无论哪种方式,程序都无法恢复。)
除此之外:这是导致一般最佳实践规则的原因,除非你的意思是杀死你的程序,否则你不能在析构函数中抛出异常。
答案 1 :(得分:0)
set_terminate()
期望该功能提供给 terminate 该程序。
如果你没有退出提供的函数,不带参数且返回void的函数。功能必须 不返回并终止该计划。 terminate_handler是一个 函数指针类型不带参数并返回void。
set_terminate会在调用你的终止函数后自动调用abort()。
只需在exit(0);
中添加my_terminate()
即可避免看到此中止()消息。