考虑以下可怕性:

#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/

10-12 17:29
查看更多