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

时间:2014-09-03 07:43:56

标签: c++ exception-handling

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  

15.1抛出异常[except.throw]

     

...

     

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

     

15.3处理异常[except.handle]

     

...

     

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

     

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

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