自分の言語で作業しているときに、フロー制御で面白いシナリオが発生しました。 break
ステートメントの処理中に例外がスローされた場合はどうなりますか。 GCCはブレークフローが失われたと信じているようだが、標準は何が起こるべきかについていくらか沈黙しているようだ。ブレーク/継続/リターンは例外によって中断されるべきですか?
例えば、次のプログラムは実際に何をすべきですか?
#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;
}
continue
が(それを見てキャッチした後、出力を追加)されますようreturn
も、ブロックされることに注意してください。ブロックの外にgoto
への試みもキャッチされます。
正しいフローは何ですか?標準はこれに対処していないようです:jump文のセクション6.6は言及しません。また、例外処理のセクション15も言及しません。デストラクタの例外はひどく悪いものですが、BOOST_SCOPE_EXITのようなものをdefer文に使用している場合は、この動作が非常に重要になる可能性があります。
おそらく、JavaとPythonでは同じ流れが起こるため、命令型言語には一貫性があるようです。
あなたの質問はC++ FAQのアドバイスであるようです:http://www.parashift.com/c++-faq-lite/dtors-shouldnt-throw.html基本的に、例外をスローラに投げ込まないでください。 FAQのこの質問は、「二重例外処理」状況にある場合に 'terminate()'がどのように呼び出されるのかを示していますが、あなたの例ではそれを行うのが悪いとのアドバイスを続けているようです。 –
@Kevin、そのアドバイスは、どの言語(C++のBOOST_SCOPE_EXITも含む)の "defer"のようなステートメントにも拡張されます。 –
どのように行動を解釈するでしょうか?デストラクタで例外を投げて、何を? – bdwain