gpt4 book ai didi

c++ - 终止时的异常处理

转载 作者:行者123 更新时间:2023-11-30 05:15:46 25 4
gpt4 key购买 nike

我有以下终止处理程序:

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 .

最佳答案

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

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

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

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

关于c++ - 终止时的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42937196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com