2014-09-03 59 views
0

的想法是“尝试you(),如果失败尝试_do(),如果失败的话,从第一次尝试上报例外,即you()”。重新抛出一个有嵌套异常的catch块的异常吗?

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

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

编辑:这个问题是不是最内侧catch,它是关于最醒目内后重新抛出外层的异常。问题在于,如果这种重新投票在法律上绝对没有被提及的问题被指出为类似的问题。

+0

另一个类似的问题:http://stackoverflow.com/questions/3526167/exception-handling-try-catch-inside-catch – 2014-09-03 07:51:47

+0

一致认为它看起来不像它被关闭了,但我我不确定是什么引发了这个问题。我会说“当然它不会重新抛出内在的例外”。考虑一个简单的'try {foo(); } catch(...){bar();扔; }'。我从来没有见过任何人担心'bar'在内部抛出并捕获异常时会发生什么。你能否扩展一下你为什么认为内部异常可能被重新抛出?更具体的问题可以得到更好的答案。 – hvd 2014-09-03 08:40:11

+0

没有咨询的标准或有任何特殊的知识对这个问题我会大胆地猜测,这只是罚款和编译器*必须*跟踪最例外。否则,如果'_DO()''使用尝试/ catch'本身幕后和它刚刚吞下异常*和它得到了内联*(甚至不内联?),不好的事情会发生在你的代码。 – 2014-09-03 08:43:18

回答

4

标准要求实施正确窝例外。从标准引证:

15.1抛出异常[except.throw]

...

8.一种掷表达无操作数重新抛出当前处理的异常( 15.3)。

15.3处理异常[except.handle]

...

7处理程序被认为是活跃的时候初始化的catch子句的完整的形式参数(如果有的话)。 ...处理程序不再被视为积极当catch子句退出或当std::unexpected()退出后正在进入因扔。

8最近激活的处理程序仍处于活动状态的例外情况称为,当前处理的例外情况为

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