2016-04-25 6 views
2

「すべての例外」を「確実に」確認するのは常に意味がありますか?たとえば:catch(...)は常に意味がありますか?

try 
{ 
    Socket_Listen(); 

    if(Return_Value == SOCKET_ERROR) 
    { 
     throw SOCKET_LISTEN_ERROR; 
    } 

    __LOG__ << "Listening..." << endl; 
} 

catch(EError_ID) 
{ 
    __LOG__; 
    Get_Last_Error_As_String(__FUNCTION__); 
} 

catch(...) 
{ 
    __LOG__ << "WARNING: An unknown error occurred." << endl; 
} 

私は、複数のエラーIDが含まれている大きな列挙型の一部である、私は自分自身(SOCKET_LISTEN_ERROR)を定義したエラーを投げています。私が投げたもの以外に、ここに投げ込まれた何か他の例外がある可能性はありますか?完全を期すために、ここにSocket_Listen()次のとおりです。

void CTCPServer::Socket_Listen() 
{ 
    Return_Value = listen(Socket, 
          2); 
} 
+1

私はいくつかの例外が発生するかもしれないことを知っているほうがよいと思います。他の例外が発生した場合、コードに欠陥がある可能性があります。また、catch(...)をキャッチすることで、例外に関する情報を取り除くことになります。 – ForceBru

+0

'完全性のために'あなたは冗談か? [最小、完全、および検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)例外、errnoのような変数、戻りコードなど、あなたが知っているものすべてを混ぜているようです。 1つのエラー処理戦略を選択し、それに固執する。場合によっては例外を無効にする(http://programmers.stackexchange.com/questions/113479/are-there-any-real-world-cases-for-c-with-exceptions)(gamedevでは一般的です)。 – Drop

+0

すべての例外をキャッチするための唯一の本当の良い使い方は、特定のポイントで起こった本当に/本当に/実際には何かを記録することです。 **例外を再投げ**ます。 –

答えて

4

それどころか、まれは、すべての例外をキャッチすることは理にかなって。 catchブロックを終了すると(再スローさせずに)、例外が解決され、プログラムが正常に実行され続けることを周囲のコードに伝えます。

何が何であるか知らずにすべての例外をキャッチすると、すべてが正常であると主張することはできません。 は、飲み込むよりも予期しない例外であるを無視する方が良いです。発信者がそれらについて心配するようにしてください(おそらく、発信者の発信者に移動させるなど)。

あなたは、そのコードからスローされる可能性のある他の例外があるかどうか尋ねます。私は知らないし、どちらもあなたをしていないので、それを捕まえることは間違いありません。テストで他の種類の例外が見つかった場合、その場所がそれらを処理する適切な場所である場合は、その場所を処理するコードを追加します。しかし、何を期待するか分かるまで、catch-all例外ハンドラを削除してください。

+0

ありがとうございます。あなたのexpanationは非常に理解しやすいです。 – YokeM

関連する問題