2016-05-14 12 views
0

私は、共有ライブラリがその中から例外をラップして、それを処理できないものにアプリケーション固有の例外として再スローするようにします。カスタム共有ライブラリの内部からアプリ固有の例外をスローすることはできますか?

私が現在持っているのは、例外がスローされた場合にリフレクションによってインスタンス化するアプリケーション固有の例外クラスを設定する静的メソッドを持つライブラリ例外です。

私の目標は、共通のコードで正常に処理できる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(); 
} 

答えて

0

保守性のために、共有ライブラリ内のアプリケーション固有の機能を回避することが一般的です。

ライブラリ固有の例外をスローし、それがあなたのユースケースであればアプリレベルでラップする方が意味があります。

ライブラリ例外:

public class LibraryException extends Exception { 
    LibraryException(Throwable t) {super(t);} 
} 

lib.SomeUtil.java

static void utilMethod() { 
    try { 
    // code with checked exception 
    } catch (Exception ex) { 
    throw new LibraryException(ex); 
    } 
} 

myApp.Client.java

void method() { 
    try{ 
    SomeUtil.utilMethod(); 
    } catch (LibraryException e) { 
    throw new MyAppEx(e); 
    } 
} 
+0

このメソッドを追加するだけで、共有ライブラリを使用するすべてのコンポーネントで、そのコンポーネントに適した方法で例外を処理できます。後で、あるコンポーネントがutilMethod()の失敗時にRuntimeExceptionをスローし、例外を処理して移動し、別のコンポーネントがLibraryExceptionを上位レベルのコンポーネントまでスローするようにすることができます。例外処理が細かくなればなるほど、プロジェクトが大きくなるにつれて問題をデバッグするのが簡単になります。 –

+0

アプリケーション固有の機能を共有ライブラリに入れることはできませんが、ランタイム値は含まれていますか?共有ライブラリが同じjvm内の複数のアプリケーションで実行されることはありませんか?チェックされたutil例外を直接処理する必要がないため、クライアントがよりきれいに呼び出せるようにしたかったのです。私はすぐに詳細を更新します。 –

+0

私はtry-catchブロックで膨らみを避けようとしていますが、util呼び出しは通常は1ライナーです。 –

0

あなたの例では、あなたのライブラリー法SomeUtil.utilMethod();いくつかの作業を行っており、例外が発生しました。いくつかのライブラリで定義された例外を通してutilメソッドを使用する方が、何が間違っているのかをユーザーに警告する方が良いでしょう。

もう1つの問題は、あるモジュールが別の例外をスローしたいときに、他のモジュールを捨てて、開発者が静的メソッドを呼び出すことを忘れた場合、ライブラリメソッドが誤解を招くような例外をスローします。このパターンは避けてください。

+0

それは 'app ex'または可能であれば' lib defined exception'を警告し、元のexを内部にラップします。マルチプロジェクトの設定では、各プロジェクトには独自のjvmインスタンスがありませんか? Pardon私の無知が、私が知っているマルチプロジェクトモジュールは、java eeのように別々に実行されます。 –

+0

まあ私は、複数のモジュールがあなたのライブラリメソッドを使用しているが、それらの要件に基づいて異なる例外をスローしたい場合、プロジェクトのようなプロジェクトがある場合はそれを意味します。例えば、モジュールA:ModuleAExceptionをいくつか投げたい、モジュールB:ModuleBExceptionを投げたい、それらはどちらも同じJVM下で実行されている同じアプリケーションの一部です。 –

関連する問題