web-dev-qa-db-ja.com

tryブロックで例外をスローする

    try { 
        if (isFileDownloaded)
            //do stuff
        else
            throw new CustomException()
   } 
   catch (Exception e)
   {
       // something went wrong save error to log
   }
   finally
   {
       //release resources
   }

私の質問は、catchがtryブロックでスローされたApplicationExceptionをキャッチすることですか?それは貧弱なコーディングスタイルですか?別の方法で書く必要がありますか?

19
Quincy

catchは例外(およびその他の発生するもの)をキャッチします。そうは言っても、私は可能な限りこのようなコードを書かないようにしています。

個人的には、同じスコープでスローされた例外の例外処理(キャッチ)を行う理由はほとんどありません。メソッドでエラーを処理できる場合-例外処理(つまり、ロギング)をtryブロックにも直接配置します。

catchブロック内のメソッドによってスローされた例外をキャッチするには、tryを使用する方がIMOより便利です。これは、たとえば、// do stuffセクションで、例外を発生させるメソッドが呼び出されました。

また、すべての例外をキャッチしないことをお勧めします(Exception e)ではなく、正しく処理できる特定のタイプの例外。これに対する1つの例外は、キャッチ内で例外を再スローする場合です。つまり、ロギングの目的で例外を使用しているが、それでもコールスタックを泡立たせる場合です。

24
Reed Copsey

はい、ApplicationExceptionから派生したExceptionをキャッチします。

ほとんどの場合、ベース例外の処理は問題ありませんログに記録するか、別のタイプの例外で何かを行う必要がある場合を除く ...

try{
    if (isFileDownloaded)
       //do stuff
    else
       throw new ApplicationException();
}
catch(ApplicationException ae)
{
   // log it application exception here...
}

catch(Exception ex)
{
   // log all other exceptions here...
}
finally
{
   // release resources...
}
8
xandercoded

また、参考までに、.NET 2.0以降、派生元の例外として ApplicationException は廃止されました。それ自体がスローする例外として意図されていなかったため、おそらくまったく使用しないでください。

2
John Saunders

はい、キャッチはApplicationExceptionをキャッチし、はい、コーディングスタイルは貧弱です。一般的なルールとしては、特定の例外と、アプリケーションの状態の修正など、何かを行う予定の例外のみをキャッチします。

1
btlog