edA*_*a-y 9 c++ language-lawyer
在使用我的语言时,我遇到了一个有流量控制的有趣场景.如果在处理break
语句时抛出异常会发生什么.海湾合作委员会似乎相信破裂流程已经失去,但标准似乎对应该发生的事情保持沉默.
例如,以下程序实际应该做什么?
#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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,a return
也将被阻止,a continue
(在catch之后添加输出以查看).goto
也将抓住在街区之外的尝试.
什么是正确的流量?标准似乎没有解决这个问题:关于跳转语句的第6.6节没有提及,关于异常处理的第15节也没有提到.我确实理解析构函数中的异常形式非常糟糕,但如果你使用类似BOOST_SCOPE_EXIT的东西来推迟语句,这种行为可能会变得非常重要.
也许有趣的是,同样的流程发生在Java和Python中,所以至少在命令式语言中似乎有一些一致性.
15.1 抛出异常对此进行了介绍:
\n\n\n\n\n2 当抛出异常时,控制权将转移到最近的具有匹配类型的处理程序 (15.3);\n \xe2\x80\x9cnearest\xe2\x80\x9d 表示后面有复合语句或构造函数初始化程序的处理程序try 关键字\n 最近由控制线程输入并且尚未退出。
\n
一旦控制权转移到异常处理程序,它就会从那里继续。没有机制可以“记住”代码位于 a 的中间break
,然后在处理异常后以某种方式恢复该代码。
归档时间: |
|
查看次数: |
264 次 |
最近记录: |