itdk 2021-03-23 23:09 采纳率: 20%
浏览 5

意外异常出现后即使修改unexpect也运行时程序似乎仍然调用了abort是怎么回事

#include<iostream>
#include<exception>
using namespace std;

//测试意外异常
void myUnexpected()
{
    throw bad_exception();
}
void Test() throw(out_of_range,bad_exception)
{
    throw logic_error("i love");
}
int main()
{
    set_unexpected(myUnexpected);
    try {
        Test();
    }
    catch (out_of_range& ex) {
        exit(5);
    }
    catch (bad_exception& ex) {
        cout << "Oop";
    }
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 23:09
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在C++中,set_unexpected()函数用于设置异常处理机制。这个函数接受一个异常类作为参数,并将它添加到可抛出的异常列表中。

    在这个例子中,我们使用了两个异常类:out_of_rangebad_exception。当我们尝试捕获这些异常时,它们会被当作普通异常进行处理,而不是作为自定义异常处理的一部分。

    所以当我们在Test函数中尝试捕获logic_error异常时,实际上是在尝试捕获普通的logic_error异常。而logic_error是继承于std::runtime_error的一个异常类型,因此它会作为一个普通异常来处理。

    当你尝试捕获logic_error时,catch语句块中的代码(在这里是cout << "Oop";)将被执行,因为这是logic_error的默认处理方式。这并不会导致abort操作,因为它是一个普通的异常处理,不是由set_unexpected()函数指定的。

    如果你想要让异常自动跳转到abort,你需要手动调用abort()函数,或者通过其他方式(例如,使用throw关键字)。但是,你不能直接通过catch语句块来触发abort

    评论

报告相同问题?