web-dev-qa-db-ja.com

Javaでチェックされた例外をチェックされていない例外にラップしますか?

私は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をスローする必要がありますか?

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

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

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

29
James McMahon

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

JDK> = 1.4を使用している場合は、次のようなことができます。

 try {
 //例外をスローする可能性のあるコード
} catch(IOException e){
 throw new RuntimeException(e); 
} catch(ClassNotFoundException e){
 throw new RuntimeException(e); 
} 

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

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

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

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

30
Eddie

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

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

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

13
MicSim

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

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

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

4
jjnguy

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

あなたhaveここかどこかで例外を処理します。

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

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

1
Nivas