【发布时间】:2014-10-27 15:13:54
【问题描述】:
想法是“尝试you(),如果失败则尝试_do(),如果失败则报告第一次尝试的异常,即you()”。
void that_thing() {
try {
you();
} catch( ... ) {
bool error=false;
try {
_do();
} catch( ... ) {
error = true;
}
if( error ) throw;
}
}
用 Gcc 测试它工作正常,我想知道它是否适用于任何编译器。为了更清楚,我所期待的奇怪行为是 throw; 会重新抛出内部异常。
编辑:这个问题不是关于最内部的catch,而是关于在捕获最内部之后重新抛出外部异常。问题是这种重新抛出是否在法律上绝对没有被指出为类似的问题。
【问题讨论】:
-
。我会说“当然它不会重新抛出内部异常”。考虑一个简单的
try { foo(); } catch(...) { bar(); throw; }。我从未见过有人担心bar在内部抛出并捕获异常时会发生什么。您能否扩展一下您认为可能会重新抛出内部异常的原因?更具体的问题可以获得更好的答案。 -
如果没有参考标准或对此问题有任何特殊知识,我会冒险猜测它很好,编译器必须跟踪最外面的异常。否则,如果
_do()在幕后使用try/catch本身并且它只是吞下了异常并被内联(甚至没有内联?),那么你的代码会发生不好的事情。 -
@hvd 我在想,如果你有一个天真的异常机制,它使用指向“当前异常”的全局指针,这个当前异常将在第二次捕获时被替换,从而在重新抛出指令。
-
@AndréPuel 啊,好的。是的,它不是那样工作的。我会检查是否能找到一个好的参考答案。