2012-06-25 29 views
10

これは「すべての例外をキャッチする方法」ではなく、「すべての例外をキャッチすべきか」です。 C#.NETでは、私は膨大な量の例外に気づいています。すべての例外をキャッチすることを計画することをお勧めしますか?すべての例外をキャッチする必要がありますか?

たとえば、DirectoryInfo()コンストラクタは4つの例外をスローします。私はこれらを捕まえることを計画すべきか、あるいは私が扱うことができるものだけを捕らえるべきでしょうか?たぶん、他の人たちに泡をつけてMain()にしましょう。ここでキャッチオールがあり、そのキャッチオールはキャッチされない例外があることをユーザーに伝えます。これらのすべての可能な例外を除けば、あなたのコードは実際のコードよりも多くの例外処理になるかもしれません。

+0

http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –

+4

個人的には、私は 'finally 'a ** lot **私がこれまでに使っていたものより多く' catch ' –

+2

@marc:これは私が数分前に質問を開くことができなかった理由ですか? ; –

答えて

14

コードを記述している抽象化のレベルを処理するのに意味のあるものだけをキャッチします。ほとんどの例外は、投げられた場所よりもはるかに高いレベルでしか捕らえられません。

はい、正しいです。 :)

+3

これ。あなただけが処理できる例外を処理します。 – hometoast

0

一般的に、処理方法を知っている例外を検出する必要があります。泡立つ例外の目的は、コードの他の部分がそれらを処理できる場合にそれらを捕まえることができるようにすることです。したがって、すべての例外を1つのレベルでキャッチすることは、おそらくあなたの望む結果を得ることにはなりません。

トップレベルでは、ユーザーにフレンドリーなエラーメッセージを表示するためにキャッチオールが必要な場合があります。これは、プログラムが誤って何かを処理していることを示している可能性があります。それは適切です。

出口を除いて正常に処理する方法がないことがあります(少なくとも出口は除外されています)。少なくとも、優雅な終了のためのUIまではこれらのバブルを上げなければなりません。

2

期待している例外をキャッチする必要があります。期待していない例外(一般的な例外ハンドラで例外をキャッチします)で正常に失敗します。あなたの例では

- DirectoryInfoを作成する()複数の例外を投げることができる - しかし、あなただけの

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed 
} 

それはあなたがセキュリティ例外をキャッチしたいということと、他のいくつかのコードを提供することができない理由はありません、うまくそれを行うが、ちょうどあなたができるそれらをキャッチして処理したい

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(SecurityException ex) 
{ 
    // Carry on but use a default path or something etc 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel 
} 
0

あなたの「一般的なケース」ハンドラを保ちます。
ロジックはかなりシンプルですが、残りの "スロー"はどうしますか?
何か(logic \ logging \ error messaging)がありたい場合を除いて、あなたは再投げようとしていて、捕まえる理由はありません。

関連する問題