2008-08-25 6 views
16

私は両方の状況にされている:Javaで例外を作成するための一般的なルールは何ですか?

  • は両方のケースでは、あまりにも多くの一般的な例外クラス

を使用して、あまりにも多くのカスタム例外

  • を作成するプロジェクトがOK始めたが、すぐに(維持するためのオーバーヘッドになりましたリファクタリング)。

    あなた自身のExceptionクラスの作成に関するベストプラクティスは何ですか?

  • +0

    「効果的なJava」の第9章では、例外に関連するこれらの側面およびその他の側面について説明しています。 –

    答えて

    14

    The Java SpecialistsExceptions in Javaについての記事を書いた、そしてそれに彼らをまとめると以下の例外を作成するためのいくつかの「ベストプラクティス」、リスト:(その便利な例外がたくさんある自分の例外を書いていない

    • は便利な例外(あなたがあなた自身の例外を記述する必要があれば、彼らが発生した問題についての有用な情報を提供することを確認してください)

    01を書く)すでにのJava APIの一部であります
    4

    基本的に、各ジョブは独自の例外が必要です。例外をキャッチすると、通常はオブジェクトと同様に異なるインスタンスを区別しないため、異なるサブタイプが必要になります。あまりにも多くのカスタム例外を使用することは、ほとんど発生しないケースです。

    1つのアドバイスは、必要に応じて例外を作成することです.1つの例外タイプが別のものの複製であることが明らかになった場合は、2つをマージしてコードをリファクタリングします。もちろん、初めから例外を構造化することにいくつかの考えがある場合に役立ちます。しかし、一般的に、既存の状況特有の例外と1対1の対応がないすべてのケースに対してカスタム例外を使用します。

    一方、NullPointerExceptionsとIndexOutofBoundsExceptionが実際にはしばしば適切かもしれません。これをキャッチしないでください(ロギングを除く)。プログラムエラーであるため、プログラムを投げた後にプログラムが未定義の状態にあることを意味します。

    8

    私の経験則は、クライアント(呼び出し元)が違うことをしたいと思ったときです。投げられた例外のタイプによっては、追加の例外タイプが保証されます。しかし、しばしば、余分な例外タイプは必要ありません。たとえば、発信者が

    try { 
        doIt(); 
    } catch (ExceptionType1 ex1) { 
        // do something useful 
    } catch (ExceptionType2 ex2) { 
        // do the exact same useful thing that was done in the block above 
    } 
    

    のようなコードを記述している場合、明らかに追加の例外タイプは必要ありません。すべての場合、呼び出されているコードが新しい例外タイプの作成では過度に高いため、このようなコードが頻繁に表示されます(または強制的に書き込まれます)。

    +4

    私はこの質問が7歳で、Java 7はその時点では存在していなかったが、まだGoogleに表示されていることを知っているので... Java 7でこれらの2つのキャッチブログをマージすることができます。 – eakyurek

    +0

    私は親指のルールが好きで、あまりにも多くの場合とあまりにもいくつかの例外のバランスをとる方法についていくつか素敵な洞察を与える – Hamy

    6

    エラーの原因となったエラーの種類を示す名前が見つからない場合、私は自分で作成します。

    これは私のルールです。

    3

    親指の私自身のルール:

    何を投げることは無関係であり、その上に余分な時間を費やすする理由をtheresのとき、私はユニットテストを除き、例外をスローすることはありません。

    カスタムビジネスロジックでエラーが発生した場合、独自のカスタム例外タイプを作成します。この例外タイプは、クライアントが実際に何が起こったかを可視化することが理にかなっている場合を除いて、可能な限り他の例外を再現するために使用されます。

    10

    私の会社の開発者が行ったことはしないでください。誰かがjava.lang.IllegalArgumentExceptionに匹敵するInvalidArgementExceptionを作成しましたが、今では数百のクラスに使用しています。どちらも、メソッドが不正または不適切な引数を渡されたことを示します。

    ジョシュア・ブロックが効果的なJavaプログラミング言語ガイドでこれをカバーしています...廃棄物についての話第8章例外項目42 [ベストプラクティスの最初のリゾート地の私のバイブル]:標準の例外の使用を優先 。彼が言っていることは少しあります。

    既存の例外を再利用することにはいくつかの利点があります。これらの中でも、は、プログラマーが既に馴染みのある規約に合致しているため、APIを学習して使いやすくしています。 [私の強調ではなく、Blochの]近いうちに、APIを使用しているプログラムは、よく知られていない例外が混在していないため、読みやすくなります。最後に、例外クラスが少ないほどメモリフットプリントが小さくなり、クラスをロードするのにかかる時間が短縮されます。

    最も一般的に再利用される例外は、IllegalArgumentExceptionです。これは一般に、呼び出し側が値が不適切な引数を渡すときにスローする例外です。たとえば、呼び出し元が何らかのアクションを繰り返す回数を表すパラメータに負の数値を渡した場合、スローするのは例外です。

    つまり、は、は例外自体をスローする必要があります。 Javaには、ほとんどの状況をカバーする組み込みの例外が豊富に用意されています。多様でよくターゲットを絞った例外があります。およびは、原因を改善できるほど十分に例外が発生したと説明しています。

    将来コードを管理しなければならないプログラマーにやさしい。

    3

    独自の例外を作成中:

    • を使用すると、自動的にハンドルによって強制やルールを宣言されたチェック例外を書きたい場合はすべての例外は、Throwable Class

    • の子でなければなりません、拡張する必要がありますException Class

    • 実行時実行を書きたい場合は、実行時例外クラスを拡張する必要があります。

    +1

    ようこそ!サイトでの作業がうまくいっています –