私は、共有ライブラリがその中から例外をラップして、それを処理できないものにアプリケーション固有の例外として再スローするようにします。カスタム共有ライブラリの内部からアプリ固有の例外をスローすることはできますか?
私が現在持っているのは、例外がスローされた場合にリフレクションによってインスタンス化するアプリケーション固有の例外クラスを設定する静的メソッドを持つライブラリ例外です。
私の目標は、共通のコードで正常に処理できる1つのアプリ固有の例外を設けることです。
これを行うより良い方法はありますか?
lib.LibExUtil.java
class LibExUtil {
static Class<? extends RuntimeException> ex = RuntimeException.class;
public static setAppEx(Class<? extends RuntimeException> ex) {
this.ex = ex;
}
static RuntimeException wrap(Throwable t) {
return (RuntimeException)ex
.getDeclaredConstructor(new Class[] {Throwable.class}).newInstance(new Object[] {t})
}
}
lib.SomeUtil.java
static void utilMethod() {
try {
// code with checked exception
} catch (Exception ex) {
throw LibExUtil.wrap(ex);
}
}
myApp.MyAppEx.java
public class MyAppEx extends RuntimeException {
MyAppEx(Throwable t) {super(t);}
}
myApp.Client.java
// initialization
LibExUtil.setAppEx(myApp.MyAppEx.class); // optional
void method() {
SomeUtil.utilMethod();
}
このメソッドを追加するだけで、共有ライブラリを使用するすべてのコンポーネントで、そのコンポーネントに適した方法で例外を処理できます。後で、あるコンポーネントがutilMethod()の失敗時にRuntimeExceptionをスローし、例外を処理して移動し、別のコンポーネントがLibraryExceptionを上位レベルのコンポーネントまでスローするようにすることができます。例外処理が細かくなればなるほど、プロジェクトが大きくなるにつれて問題をデバッグするのが簡単になります。 –
アプリケーション固有の機能を共有ライブラリに入れることはできませんが、ランタイム値は含まれていますか?共有ライブラリが同じjvm内の複数のアプリケーションで実行されることはありませんか?チェックされたutil例外を直接処理する必要がないため、クライアントがよりきれいに呼び出せるようにしたかったのです。私はすぐに詳細を更新します。 –
私はtry-catchブロックで膨らみを避けようとしていますが、util呼び出しは通常は1ライナーです。 –