我是否必须手动重新引发异常

Do I have to manually rethrow an exception?

本文关键字:新引发 异常 是否      更新时间:2023-10-16

我有以下调用层次结构:

A 类 ->

B 类 -> C 类

如果在类 C 中抛出异常,而我想在类 A 中处理它,我是否必须在类 B 中手动重新抛出它,或者它是否通过调用层次结构冒泡?

如果你在途中的任何地方都没有抓住它,它会自动冒泡。一个完整的代码示例:

#include <iostream>
#include <exception>
using namespace std;
void C() 
{
    throw exception();
}
void B() 
{
    C();
}
void A() 
{
    try {
        B();
    } catch (exception& e) {
        cout << e.what();      // Here you can access the exception thrown by C()
    }
}
int main()
{
    A();
}

我假设它的设置方式是:class A::method()调用class B::method()调用class C::method()

异常对象的构造将调用堆栈展开:

控制流向后工作(在调用堆栈上(,直到到达try块的开头,此时所有关联的 catch 块的参数将按出现顺序与异常对象的类型进行比较以查找匹配项(有关此过程的详细信息,请参阅try-catch(。如果未找到匹配项,控制流将继续展开堆栈,直到下一个try块,依此类推。如果找到匹配项,控制流将跳转到匹配的 catch 块。

通常,清理是此"堆栈展开"的一部分,直到与抛出的异常对象(或与任何异常对象匹配的catch(...)(匹配的catch块。但是,如果没有找到这样的catchterminate则调用,并且标准要求清理对象。

异常

会"冒泡"调用堆栈,直到找到处理程序std::terminate或调用处理程序(如果没有(。

注意:在发生动态异常规范冲突的情况下,使用自定义unexpected处理程序时,您可能会看到不同的行为。