考虑以下可怕性:
#include <iostream>
struct thing
{
thing()
{
std::cout << "thing ctor\n";
throw 5;
}
};
void SomeTerminateHandler()
{
std::cout << "Uncaught exception!?\n";
}
int IHopeThisGetsCalledFirst()
{
std::cout << "IHopeThisGetsCalledFirst()\n";
std::set_terminate(SomeTerminateHandler);
return 2;
}
const int x = IHopeThisGetsCalledFirst();
const thing y;
int main()
{
}
输出:
IHopeThisGetsCalledFirst()
thing ctor
Uncaught exception!?
这依赖于静态初始化顺序(which I can mess with, for MSVS anyway),因此即使以下问题具有可接受的答案,也不是很理想。
如何在
SomeTerminateHandler
中“捕获”异常,以便显示错误对话框或注销错误详细信息?在上述程序中,在
abort
之后调用SomeTerminateHandler
。为什么? This说:“默认情况下,终止处理程序调用cstdlib的中止函数。” -但我没有使用默认的终止处理程序,我的也不调用abort
。有什么我可以做的以处理静态初始化时间中的异常。如果没有,为什么不呢?为什么在语言中没有允许这样做的内容?
最佳答案
如何在SomeTerminateHandler
中“捕获”异常,以便显示错误对话框或注销错误详细信息?
没什么-只有异常处理程序可以访问引发的异常。
在上述程序中,在abort
之后调用SomeTerminateHandler
。为什么?
您的终止处理程序不得返回;标准(C ++ 11,18.8.3.1)要求它“在不返回调用者的情况下终止程序的执行”-您链接到的页面也有相同的含义。如果您违反了该要求,那么任何事情都可能发生。
我有什么办法可以处理静态初始化时间内的异常?
您可以在构造函数中捕获异常。或者您可以避免使用复杂的静态对象。
如果没有,为什么不呢?为什么在语言中没有允许这样做的内容?
我无法回答为什么,但是C ++根本无法处理复杂的静态对象。即使您的编译器确实具有非标准扩展名来指定初始化顺序,我也建议尽可能避免使用它们。
关于c++ - 有什么方法可以在构造静态/全局时捕获抛出的异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9503533/