私は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をスローする必要がありますか?
これを行うためのより良い方法はありますか、それともそもそもこれを試みるべきですか?
編集:
明確にするためだけに。構成ファイルは基本的にプログラムの操作に対するものであり、すべての例外はプログラムの最上位でキャッチされてログに記録されるため、これらの例外は致命的です。
私の目的は、ファクトリを呼び出すすべてのメソッドのシグネチャに例外が追加される、不要なスロー例外を回避することです。
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
は、IllegalStateException
、TypeNotPresentException
、およびUnsupportedOperationException
です。
また、スレッドがRuntimeExceptionをキャッチし、少なくともログに記録することは常に良い考えであることに注意してください。少なくともこの方法で、スレッドがなくなる理由を理解できます。
例外処理のベストプラクティスに関する2つのポイント:
また、呼び出し元が実行できる内容に応じて、内部例外の有無にかかわらず、RuntimeExceptionをスローできます。内部例外を再スローしない場合は、重要であれば、メソッドにログインする必要があります。
あなたはそれを正しい方法でやっています。
チェックされていない例外を通過させるには、チェックされていない例外でラップする必要があります。
例外は理由でチェックされることを覚えておいてください。
try - catch
esが多すぎるのを避けたい場合は、ファクトリ自体で両方の例外をキャッチし、そこで処理します。おそらくデフォルトの実装を返します。
あなたhaveここかどこかで例外を処理します。
また、これはファクトリであるため、これらの例外をファクトリ自体(同じメソッドまたは異なるメソッド)で処理し、デフォルトの実装を返す方がよいと思います。
とにかく、(ビジネス関数の)呼び出し元は、ClassNotFoundException
に遭遇したときに何をしなければならないかについての手がかりを持っていません。