从几个函数调用中抛出异常的方法,一直返回到main

Way to throw exceptions out of several function calls all the way back to main?

本文关键字:方法 一直 返回 main 抛出异常 函数调用 几个      更新时间:2023-10-16

从几个函数调用中抛出异常并一直返回main的"正确"方法是什么?

例如,我现在正在做的是:

void foo() {
    ...
    try {
    ...
    }catch(a1) {
            ...
        throw(a2);
    }
    ...
}
void baz() {
    ...
    try {
        foo();
    }catch(a2) {
        ...
        throw(a3);
    }
    ...
}

etc

一定有一种更好的方法可以在不捕获过程中的每个异常的情况下抛出并退出调用堆栈,是吗?

Per[except.shop]

当抛出异常时,控制权将转移到具有匹配类型的最近处理程序(15.3);"最近的"表示控制线程最近为其输入try关键字后面的复合语句或ctor初始值设定项但尚未退出的处理程序。

这意味着,如果抛出异常,并且没有一个处理程序与其类型匹配,则异常将向上传播,直到它找到一个或没有找到。你可以在这个小例子中看到这一点

#include <iostream>
#include <exception>
void foo3() { std::exception e; throw(e); }
void foo2() { try { foo3(); } catch (std::bad_exception){} }
void foo() { foo2(); }

int main()
{
    try
    {
       foo();
    }
    catch (std::exception & e)
    {
        std::cout << "caught in main()";
    }
}

输出:

caught in main()

实时示例