【C++】自定义未处理异常抛出后,所调用的中止函数

在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)

应该注意的是,自定义终止处理程序必须做的唯一事情是停止程序的执行。它不能以任何方式返回到程序或恢复程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值