从catch块中重新抛出异常有嵌套异常吗?

And*_*uel 1 c++ exception-handling

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

void that_thing() {
    try {
        you();
    } catch( ... ) {
        bool error=false;
        try {
            _do();
        } catch( ... ) {
            error = true;
        }
        if( error ) throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

用Gcc测试它工作得很好,我想知道它是否适用于任何编译器.为了更清楚,我期待的奇怪行为是throw;重新抛出内部异常.

编辑:这个问题不是关于最内在的问题catch,而是关于在捕获最内层之后重新抛出外部异常.问题是,如果这种重新抛出在法律上肯定没有在被指向相似的问题上接近.

小智 5

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

15.1抛出异常[except.throw]

...

8 没有操作数的throw-expression重新抛出当前处理的异常(15.3).

15.3处理异常[except.handle]

...

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

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

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