2017-04-27 2 views
1

関数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; 
} 

なぜデフォルトキャッチが必要ですか?

+0

このケースではおそらくそうではありませんが、例外をキャッチして再スローすることが正当化される可能性があるいくつかの例を見るには、http://stackoverflow.com/questions/27152201/why-rethrow-an-exceptionへの回答をチェックしてください/避けられない。 – sigbjornlo

+0

デフォルトの再スローなしでも、デフォルトのスローがあるかのように実行されます。どのようにそのような行動を理解する? –

+0

これは 'defualt:break;'ラベルを持つようなものです。無意味ですが、ある意味では完全です。また、愚かな警告を発する静的解析ツールを緩和する必要があるかもしれません。 – StoryTeller

答えて

0

デフォルトのキャッチャーは、明示的に処理されないすべての例外を捕捉するために存在します。 例外はスローされる可能性がありますが、デフォルトのキャッチャーは少し編集的です。 しかし、特定の処理を行うために1つの例外タイプをキャッチし、他のすべてのケースで同じハンドラを実行したい場合、デフォルトのハンドラは重複を防止します。

+0

この質問に対する質問に明示的に答えた場合、この回答は「より良い」ものになります。 – juanchopanza

0

ここでやっていることは、以前のcatchステートメントでは検出されなかった例外をキャッチしていますが、他の場所でキャッチされる可能性があります。 catch(...)ステートメントが存在しない場合と同じように機能しますが、そうでない場合は、適切なcatchブロックでキャッチされない例外が処理されるまで(g()f()main())、別のtryブロックmainで処理されます)。例外を処理するためにcatchがない場合、システムはそれを引き継ぎます。

throwの例外は、catch(...)にあります。NOTデフォルトの動作です。これは、コードにthrowを追加して実装したものです。例:ない理由

cout << "..."は、それは異なっている場合には例外が質問が不明確であり、2つの方法で解釈される可能性が私にはmain()

+0

投げられた例外が伝播するまで処理されないかぎりですか? –

+0

@VishvajeetTはい、スローされた例外にsimiledが起こる必要があります、それは消えません。そのため、投げられた例外に対して「キャッチ」がない場合、OSはそれを処理します(ほとんどの場合、プログラムは「未処理の例外」というメッセージで終了します)。 – Rogus

+0

この回答は明示的に「より良い」尋ねられる質問に答えました。 – juanchopanza

0

によって、その後f()で扱うとされるだろう、catch(...)を持っていないために比較働くだろうデフォルトのキャッチメカニズムはまったく存在します:他の答えは意味のある回答を与えます)。

はなぜgthrow;でデフォルトcatchを持っている、と私は2つの可能性を参照してください。それは他の例外が考慮されていることを文書化し、(それにブレークポイントを置くことによって)そのような場合をデバッグする方が簡単です。

関連する問題