📜  在C++中自定义未捕获异常的终止行为

📅  最后修改于: 2021-05-30 02:34:07             🧑  作者: Mango

每当C++中出现异常时,都会按照使用try-catch块定义的行为进行处理。但是,通常会抛出一个异常但没有捕获到异常,这是因为异常处理子系统无法为该特定异常找到匹配的catch块。在这种情况下,将执行以下一组操作:

  1. 异常处理子系统调用该函数: Unexpected() 。默认C++库提供的此函数定义发生未捕获的异常时的行为。默认情况下,意外调用终止()
  2. 终止函数定义了过程终止期间要执行的动作。默认情况下,这会调用abort()
  3. 该过程中止。

这些terminate()和unexpected()只是调用其他函数来实际处理错误。如上所述,终止调用中止(),并且意外调用()终止()。因此,当发生异常处理错误时,这两个函数都会停止程序执行。但是,您可以更改终止的方式。

要更改终止处理程序,使用的函数是set_terminate(terminate_handler newhandler),该函数在标头定义。

以下程序演示了如何设置自定义终止处理程序:

// CPP program to set a new termination handler
// for uncaught exceptions.
#include 
#include 
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)

应当适当注意的是,您的自定义终止处理程序必须做的唯一一件事就是停止程序执行。它不得返回程序或以任何方式继续执行。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”