如何捕获从类的全局实例的构造函数抛出的异常?

saj*_*jas 13 c++ constructor exception-handling global

我知道拥有全局变量并不受欢迎.但在本书中,作者Bjarne Stroustrup撰写的C++编程语言称,"在非本地静态对象的初始化器抛出的情况下获得控制权的唯一方法是set_unexpected()".怎么做?

saj*_*jas 7

我在其他一些论坛上发布了这个问题并得到了一些答案.

第一个是声明一个指针而不是一个对象并在main()中初始化它

第二个是从另一个执行set_terminate的类派生类(其构造函数抛出异常),以便设置一个有意义的处理程序.第二个似乎在codeblocks ide中工作正常.

我用来测试它的代码是:

void f()        //Unexpected exception handler
{
    cout<<"Terminate called "<<endl;
    exit (0);
}
class A         //Base class that performs set_unexpected
{
    terminate_handler h;
public:
    A()
    {
        h=set_terminate(f);
    }
    ~A()
    {
        set_terminate(h);
    }
};
class B:public A    //Derived class that throws unexpected_exception
{
public:
    B()
    {
        throw 1;
    }
};
B b;
int main()
{
}
Run Code Online (Sandbox Code Playgroud)

程序显示消息:"终止被叫"并退出.

  • 第一种解决方案的优点是实际上有可能_handling_异常并做一些有用的事情.通常,您仍然只会打印一条消息并终止该过程,但有时可以从异常中恢复.OTOH,第二个解决方案是错误的,应该使用`set_terminate`(`unexpected`确实_not_处理未捕获的异常,它处理不符合函数异常规范的异常!).但即便如此,一旦进入终止函数,除了杀死进程之外你还能做些什么呢?你无处可去. (4认同)