异常处理 - 在没有任何处理程序的情况下抛出异常

时间:2012-04-07 14:33:01

标签: c++

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!”出现对话框。

  
     

我不确定为什么会这样来!!!!请帮忙。

3 个答案:

答案 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::atexitstd:: at_quick_exit注册的函数中发生的异常情况。这将导致第二次尝试呼叫std::exit

总之,如果你不想要“异常”终止,你几乎总是需要捕获你抛出的异常。

答案 2 :(得分:1)

您必须在终止处理程序中退出程序。将以下行添加到处理程序中它将起作用:

exit(-1);