正在从具有嵌套异常的catch块重新引发异常

Is rethrowing an exception from catch block which has an nested exception okay?

本文关键字:异常 catch 新引发 嵌套      更新时间:2023-10-16

想法是"尝试you(),如果失败,则尝试_do(),如果失败则报告第一次尝试的异常,即you()"。

void that_thing() {
    try {
        you();
    } catch( ... ) {
        bool error=false;
        try {
            _do();
        } catch( ... ) {
            error = true;
        }
        if( error ) throw;
    }
}

用Gcc测试它工作得很好,我想知道它是否能与任何编译器一起工作。更清楚地说,我预期的奇怪行为是throw;会重新抛出内部异常。

编辑:这个问题不是关于最内部的catch,而是关于在捕获最内部之后重新抛出外部异常。问题是,在被指为类似的问题上,这种重新思考是否在法律上绝对没有被提及。

标准要求实现正确嵌套异常。引用标准:

15.1引发异常〔except.sthrow〕

8没有操作数的抛出表达式会重新引发当前处理的异常(15.3)。

15.3处理异常[除.handle]

7当catch子句的形式参数(如果有的话)初始化完成时,处理程序被认为是活动的。。。当catch子句退出时,或者当std::unexpected()在由于抛出而被输入后退出时,处理程序不再被视为活动的。

8最近激活的处理程序仍处于活动状态的异常称为当前处理的异常

当代码到达throw;时,内部异常处理程序不再处于活动状态:catch子句已退出。外部异常处理程序仍然处于活动状态:它尚未退出,并且尚未调用std::unexpected()。因此,实现必须支持这种用法,并重新抛出外部异常。全球";当前异常";在内部处理程序退出后被清除的指针将不符合C++标准的要求。