终止

时间:2017-03-21 20:08:58

标签: c++ visual-studio-2015 exception-handling terminate

我有以下终止处理程序:

void on_terminate() 
{
    std::exception_ptr eptr = std::current_exception();
    if (eptr)
    {
        try
        {
            std::rethrow_exception(eptr);
        }
        catch (const std::exception& e) 
        {
            DBG_FAIL(e.what());        
        }
        catch (...) 
        {
            DBG_FAIL("Unknown exception.");  
        }
    }
    else
    {
        DBG_FAIL("Terminate was called.");
    }    
}

我一直在使用这个处理程序一段时间,我坚信它有用。但最近看来,当一个例外被抛弃时,我仍然会在"Terminate was called."结束。 (我仍然得到一个有用的调用堆栈。)

我遇到VS2015 Up3上的问题,还没有时间检查其他编译器和平台。 (关于Cygwin的GCC还没有实现exception_ptr。)我做了一些根本错误的事情吗?

给出以下代码:

int main(int argc, char* argv[]) 
{
    std::set_terminate(on_terminate);

    throw std::runtime_error("#yolo");
}

您可以测试该问题。

为了完整起见,您可以找到我的dbg.h

1 个答案:

答案 0 :(得分:1)

不确定标准对此有何看法,但它也不适用于VS2017。您可以通过执行以下操作来获得所需的行为:

int main(int argc, char* argv[]) try
{
    std::set_terminate(on_terminate);

    throw std::runtime_error("#yolo");
}
catch (...) {
    std::get_terminate()();
}

将从catch中调用您的终止方法,然后std::current_exception()中的on_terminate将起作用。