void myterminate ()
{
cout << "terminate handler called";
}
int main (void)
{
set_terminate (myterminate);
throw; // throwing an exception. So, terminate handler should be invoked
// as no one is handling this exception.
getch();
return 0;
}
但执行此代码后,输出为:
终止处理程序调用+“Debug Error!”出现对话框。
我不确定为什么会这样来!!!!请帮忙。
答案 0 :(得分:4)
根据set_terminate的MSDN文档,新的处理函数必须调用exit()
或abort()
:
set_terminate函数将term_func安装为terminate调用的函数。 set_terminate与C ++异常处理一起使用,可以在抛出异常之前在程序中的任何位置调用。默认情况下终止调用中止。您可以通过编写自己的终止函数并使用函数名称作为参数调用set_terminate来更改此缺省值。 terminate调用最后一个函数作为set_terminate的参数。执行任何所需的清理任务后,term_func应退出程序。如果它没有退出(如果它返回到它的调用者),则调用abort。
例如:
void myterminate ()
{
cout << "terminate handler called";
exit(1);
}
答案 1 :(得分:2)
根据标准的要求,用作terminate_handler
的函数必须满足以下要求(ISO / IEC 14882:2011 18.8.3.1):
必需的行为:
terminate_handler
将终止程序的执行而不返回 给来电者。
由于您的功能不符合此要求,因此您的程序具有未定义的行为。为了查看自定义诊断,您应该向std::cout
输出换行符(因为在许多平台上可能需要这样做),然后以某种方式终止程序,例如调用std::abort
。
std::abort
用于指示程序异常终止,因此您可以期望向用户报告额外的诊断信息,例如通过您看到的对话框。
请注意,使用终止处理程序中的std::exit
可能会有危险,因为可能会调用std::terminate
以响应在std::atexit
或std:: at_quick_exit
注册的函数中发生的异常情况。这将导致第二次尝试呼叫std::exit
。
总之,如果你不想要“异常”终止,你几乎总是需要捕获你抛出的异常。
答案 2 :(得分:1)
您必须在终止处理程序中退出程序。将以下行添加到处理程序中它将起作用:
exit(-1);