我在处理语言时遇到了一个有趣的流程控制场景。当处理 break 语句时发生异常会发生什么呢?GCC 认为 break 流程丢失,但标准似乎没有明确规定应该发生什么。
例如,以下程序应该做什么?
请注意,
正确的流程是什么?标准似乎没有涉及到这一点:第6.6节关于跳转语句并没有提到,异常处理的第15节也没有。我确实明白,在析构函数中使用异常会导致非常糟糕的结果,但如果您正在使用像BOOST_SCOPE_EXIT这样的延迟语句,这种行为可能变得非常重要。
有趣的是,Java和Python中也发生了相同的情况,因此至少在命令式语言中似乎存在一些一致性。
例如,以下程序应该做什么?
#include <iostream>
using namespace std;
struct maybe_fail {
bool fail;
~maybe_fail() {
if( fail )
throw 1;
}
};
int main() {
for( int i=0; i < 6; ++i ) {
cout << "Loop: " << i << endl;
try {
maybe_fail mf;
mf.fail = i % 2;
if( i == 3 )
break;
} catch( int ) {
cout << "Caught" << endl;
}
}
return 0;
}
请注意,
return
语句也将被拦截,continue
同理(添加catch后的输出以查看)。试图跳出块外部的goto
也会被捕获。正确的流程是什么?标准似乎没有涉及到这一点:第6.6节关于跳转语句并没有提到,异常处理的第15节也没有。我确实明白,在析构函数中使用异常会导致非常糟糕的结果,但如果您正在使用像BOOST_SCOPE_EXIT这样的延迟语句,这种行为可能变得非常重要。
有趣的是,Java和Python中也发生了相同的情况,因此至少在命令式语言中似乎存在一些一致性。
terminate()
,但是你的例子似乎继续了这个建议,即这样做是不好的。 - Kevin Andersonbreak
语句并退出循环(当有人编写break
时,意图是退出循环,因此这样做同样合理,甚至更合理)。 - edA-qa mort-ora-y