2011-10-31 17 views
12

一般的に、メソッド内のほとんどの条件付きの失敗を処理するのに十分な場合は、汎用(java.lang.Exception)例外をスローすることをお勧めしますか?メソッドが複数のタイプの例外をスローする可能性がある場合、例外の特定のサブクラスを投げると処理がはっきりするかもしれませんが、一般的な失敗/成功のケースではExceptionが適切以上に機能していると思います。ジェネリック例外をスローすることはお勧めできませんか?

+0

[JavaまたはC#の例外管理のベストプラクティス](http://stackoverflow.com/questions/409563/best-practices-for-exception-management-in-java-or-c-sharp)の可能な複製 –

答えて

20

など、発生する可能性があります文脈から生じる条件。通常の状況では、BufferOverflowExceptionまたはUnsupportedOperationExceptionをキャッチしたくありません。さらに、別々のException型を投げることで、それぞれを処理する方法を呼び出しコードで制御することができます。新しいマルチキャッチ機能により、Java 7でボイラープレートが削減されました。

+1

それは別の重要な問題、+1です。 –

+0

@MarkPeters私はめったに「決して」とは言いませんが、ひどいアンチパターンでさえ、歪んだ状況で正しい答えになると思うので、例外を注意深く取ることが最善です。時々、あなたが書いていないコードで処理されなければならないでしょう。そして、店のいたるところに抽象化が漏れるでしょう。そして、もちろん、Throwableを捕まえた人は大したことではない:D –

+0

+1 - 本当に良い点。 – DerMike

5

より具体的な例外をスローすると、いずれの呼び出しコードも1つのException catchブロック内のすべてのコードを処理できなくなります。より具体的には、どのような種類のエラーが発生しているかをより詳細に文書化することができ、プログラマーはそれらを個別に処理しやすくなります。

さらに、「Exception」自体を投げることによって、呼び出し元にコードの例外を排除することはできないことを基本的に伝えています。 NumberFormatException得るようIOException問題は、それが例外ではなく、プログラミングに問題があることを示したようExceptionがキャッチされるべきではないいくつかのものを包含するRuntimeExceptionのスーパーもあるということである

1

一般的に、あなたのアプリで何が起こったのかを知りたいときに、特定の例外を捕捉して、プログラムが失敗する(または実行順序が高くなる)ようにします。 例外をキャッチするとすべてがキャッチされ、場合によってはプログラムが失敗していることがわかりません。

3

いつも通り:それは依存しています。

あなたが他人に公開するAPIの違いがあると思います。それはしばらくの間生きるかもしれない。その場合、発呼者が自分のケースで最もよく考えていることは分かりません。

一方、常に内部で自分でのみ使用するコードがあります。一般的な例外をスローするだけで十分かもしれません。ただし、後ほど例外処理を変更することをお勧めします。すべてのエラーケースが混在すると難しくなります。

0

DittosからGH。私はあなたの本当のアプリケーションの例外と同じブロックでキャッチするためにおそらく見ていない種類の例外のより明白な例として "nullポインタ例外"と "メモリ不足例外"を使用していたでしょう。

将来の拡張性のために多少の努力をしてもらうことをお勧めします。その場所全体にジェネリック例外をスローし、後でいくつかの例外を捕捉する必要があると判断した場合、戻ってそれらをすべて変更することは大きな苦痛になる可能性があります。しかし、あなたが進むにつれて必要な例外を作成すれば、それほど大きな問題ではありません。メッセージでコンストラクタを受け付けるだけの新しい例外クラスを作成するには、5行のコードが必要ですか?これは将来のための良い投資です。

プログラミングの多くのことと同様、あなたがどれだけ遠くに行くのかという問題です。私は通常、私が作業しているほぼすべてのプロジェクトでかなり一般的な "BadInputException"を作成し、ユーザーの入力が検証基準に合格しなくなったときにこれをスローします。次に、BadInputExceptionを捕捉して画面にメッセージを投げることができます。一貫性のないデータとそのようなことの例外をスローする複雑なクラスを作成すると、通常は例外クラスが作成されます。私が "TalkToDatabase"クラスを作成する場合と同様に、私は "TalkToDatabaseException"を作成します。 (多分、複数の種類の例外がある場合、私はそれを捕捉したいと思っていますが、少なくとも1つは例外です。)

あなたがこれを考えているかどうかは分かりませんが、エラーメッセージのテキストを調べてエラーの種類を判断することを強くお勧めします。私は、彼らがすべての場所での一般的な例外をスローするプログラムを見てきましたし、その後のcatchブロックで、彼らはそれだけでこれらのケースのための個別の例外を作るために多くの方が良いだろう

// Very bad idea! Don't do this! 
catch (Exception ex) 
{ 
    if (ex.getMessage().equals("Invalid foo")) 
    ... handle bad foo ... 
    else if (ex.getMessage().equals("Plugh is over maximum")) 
    ... handle bad plugh ... 
    ... etc ... 
} 

ようなコードを持っています。処理がはるかに効率的になるだけでなく、上記を行い、後で誰かが来て「Foo is invalid」にメッセージを変更することを決めたとしますか?プログラムはコンパイルされますが、正しく動作しません。

関連する問題