在C++中,每当有异常出现时,都会按照使用try-catch块定义的行为来处理。然而,经常有这样的情况:一个异常被抛出,但没有被捕获,因为异常处理子系统没有找到与之匹配的捕获块。在这种情况下,就会发生以下一系列的动作:
-
异常处理子系统调用函数: unexpected()。这个函数由默认的C++库提供,定义了出现未捕获的异常时的行为。默认情况下,unexpected调用terminate()。
-
terminate函数定义了进程终止时要执行的动作。默认情况下,它调用abort()。
-
进程被终止。
terminate()和unexpected()只是调用其他函数来实际处理一个错误。如上所述,unexpected() -> terminate() -> abort()。因此,当异常处理错误发生时,程序的运行会被中止。在某些时候,我们希望能够在这个过程中获得更多的信息,分析出错原因,避免后续再出现这个错误。C++也提供了方法,让我们可以改变终止发生的方式。
要改变终止处理程序,使用的函数是set_terminate(terminate_handler newhandler)
,它被定义在头文件<exception>
中。
下面的程序演示了如何设置一个自定义的终止处理程序。
// CPP program to set a new termination handler
// for uncaught exceptions.
#include <exception>
#include <iostream>
using namespace std;
// definition of custom termination function
void myhandler()
{
cout << "Inside new terminate handler\n";
abort();
}
int main()
{
// set new terminate handler
set_terminate(myhandler);
try {
cout << "Inside try block\n";
throw 100;
}
catch (char a) // won't catch an int exception
{
cout << "Inside catch block\n";
}
return 0;
}
终端输出:
Inside try block
Inside new terminate handler
错误信息:
Abort signal from abort(3) (SIGABRT)
应该注意的是,自定义终止处理程序必须做的唯一事情是停止程序的执行。它不能以任何方式返回到程序或恢复程序。