这个想法是"尝试you()
,如果失败,请尝试_do()
,如果失败则报告第一次尝试的异常,即you()
"。
void that_thing() {
try {
you();
} catch( ... ) {
bool error=false;
try {
_do();
} catch( ... ) {
error = true;
}
if( error ) throw;
}
}
使用Gcc测试它工作正常,我想知道它是否适用于任何编译器。为了更清楚,我期待的奇怪行为是throw;
会重新抛出内部异常。
编辑:这个问题不是关于内部最catch
,而是关于在捕获内部最重要时重新抛出外部异常。问题是,如果这种重新抛出在法律上肯定没有在被指向相似的问题上接近。
答案 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 ++标准的要求不匹配。