【发布时间】:2017-08-13 17:08:27
【问题描述】:
我有以下终止处理程序:
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。
【问题讨论】:
-
不,因为 eptr 为空。裁判的问题是关于没有主动例外的重新抛出。这个问题更具体地说是关于 std::current_exception() 从终止处理程序返回 null 。 (但感谢您的努力。)
标签: c++ visual-studio-2015 exception-handling terminate