33

私はJavaでこのファクトリメソッドを持っています:

public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
    if (config == null) {
        InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
        config = new Properties();
        config.load(in);
    }
    return config;
}

そして、2 つのチェック済み例外を非チェック済み例外に変換したいと考えています。これについて最善の方法は何ですか?

例外をキャッチし、キャッチした例外を内部例外として使用して新しい RuntimeException をスローする必要がありますか?

これを行うためのより良い方法はありますか、それとも最初からこれを試みるべきですか?

編集:
明確にするために。これらの例外は致命的です。構成ファイルは基本的にプログラムの操作に関係しており、すべての例外はプログラムの最上位でキャッチされてログに記録されるためです。

私の目的は、工場を呼び出すすべてのメソッドのシグネチャに例外が追加され、不要なスロー例外を回避することです。

4

4 に答える 4

38

ARuntimeExceptionは、問題が何であれ、クライアントが回復できない場合にのみ使用する必要があります。あなたが話していることをすることが時々適切ですが、より多くの場合それは適切ではありません。

JDK> = 1.4を使用している場合は、次のように実行できます。

試す {
  //例外をスローする可能性のあるコード
} catch(IOException e){
  新しいRuntimeException(e);をスローします。
} catch(ClassNotFoundException e){
  新しいRuntimeException(e);をスローします。
}

そして、再スローRuntimeExceptionされたものには、元の原因が含まれています。このように、スレッドの上部にいる誰かがキャッチしRuntimeExceptionます-あなたのスレッドはキャッチRuntimeExceptionするので、黙って死ぬことはありませんよね?--少なくとも原因の完全なスタックトレースを出力できます。

しかし、他の人が言っているように、そして言うように、例外は理由のためにチェックされます。これを行うのは、チェックされていない例外として再スローしている問題からクライアントが回復できないことが確実な場合のみにしてください。

注:RuntimeException利用可能な場合は、より具体的なチェックされていない例外を使用するよりも優れています。たとえば、メソッドがをスローできる唯一の理由ClassNotFoundExceptionが構成ファイルが欠落しているためである場合MissingResourceException、これを再スローできます。これはチェックされていない例外ですが、スローする理由に関する詳細情報を提供します。あなたが投げ直している問題をRuntimeException説明している場合に使用する他の良いものはIllegalStateException、、です。TypeNotPresentExceptionUnsupportedOperationException

また、スレッドがRuntimeExceptionをキャッチし、少なくともログに記録することは常に良い考えであることに注意してください。少なくともこの方法で、スレッドがなくなる理由を理解できます。

于 2009-01-27T19:24:46.337 に答える
15

例外処理のベストプラクティスに関する2つのポイント:

  • 呼び出し元のコードは例外について何もできません->チェックされていない例外にします
  • 呼び出し元のコードは、例外の情報に基づいていくつかの有用な回復アクションを実行します->チェックされた例外にします

また、呼び出し元がRuntimeExceptionを使用して何ができるかに応じて、内部例外の有無にかかわらず、RuntimeExceptionをスローできます。内部例外を再スローしない場合は、重要であれば、メソッドにログインする必要があります。

于 2009-01-27T19:37:59.603 に答える
4

あなたはそれを正しい方法でやっています。

チェックされていない例外を通過させるには、チェックされていない例外でラップする必要があります。

例外は理由でチェックされることを覚えておいてください。

于 2009-01-27T19:21:01.510 に答える
1

あまりにも多くのesを避けたい場合try - catchは、ファクトリ自体で両方の例外をキャッチし、そこで処理します。おそらくデフォルトの実装を返します。

ここまたは他の場所で例外を処理する必要があります。

また、これはファクトリであるため、これらの例外はファクトリ自体(同じメソッドまたは異なるメソッド)で処理され、デフォルトの実装を返す方がよいと思います。

とにかく、(ビジネス機能)呼び出し元は、に遭遇したときに何をしなければならないかについての手がかりを持っていませんClassNotFoundException

于 2009-01-27T19:35:18.360 に答える