関数g()では、コメント行LABEL(デフォルトのハンドラ)の結果として、同じ出力が得られます。なぜデフォルトキャッチがあるのですか?デフォルトの機能を再試行する場合、デフォルトの例外キャッチがあるのはなぜですか?
#include <iostream>
#include <exception>
using namespace std;
void h() {
//throw 1; //A
//throw 2.5; //B
throw 'a'; //C
//throw "add"; //D
}
void g() {
try {
h();
}
catch (int) { cout << "int"; }
catch (double) { cout << "double"; }
catch (...) { throw; } //LABEL - commenting this line gives same result
}
void f() {
try {
g();
}
catch (char) { cout << "Char"; }
catch (...) { throw; }
}
int main() { //main func
try {
f();
}
catch (...) { cout << "Unknown"; }
return 0;
}
なぜデフォルトキャッチが必要ですか?
このケースではおそらくそうではありませんが、例外をキャッチして再スローすることが正当化される可能性があるいくつかの例を見るには、http://stackoverflow.com/questions/27152201/why-rethrow-an-exceptionへの回答をチェックしてください/避けられない。 – sigbjornlo
デフォルトの再スローなしでも、デフォルトのスローがあるかのように実行されます。どのようにそのような行動を理解する? –
これは 'defualt:break;'ラベルを持つようなものです。無意味ですが、ある意味では完全です。また、愚かな警告を発する静的解析ツールを緩和する必要があるかもしれません。 – StoryTeller