2016-10-18 17 views
1

私はUtilクラスを持っています。このクラスでは、来るメッセージを記録し、送信された例外をスローする単純なメソッドを実装しようとしています。単純な理由で、私はそれを達成できませんでした。パラメータとして来る例外をログに記録してスローする例外メソッド

現在の方法は次のようになります。

public static void handleException(Exception exception, String errorMessage) 
    { 
    LOGGER.error(errorMessage + "\n " + exception.getMessage()); 
    throw new IllegalArgumentException(errorMessage + "\n " + aException.getMessage()); 
    } 

しかし、私ははIllegalArgumentExceptionが、(例外a.k.a)パラメータとして送信される例外のタイプだけでなくたい。

public static void handleException(FooException exception, String errorMessage) 
    { 
    LOGGER.error(errorMessage + "\n " + exception.getMessage()); 
    throw new FooException(errorMessage + "\n " + aException.getMessage()); 
    } 

これを達成する最も良い方法は次のうちどれですか?

+0

なぜ新しい例外を作成して、パラメータとして既に取得しているものを投げるのではないのですか? – ArcticLord

+0

@ArcticLord私は、例外処理をUtilクラスに集中させたいだけです。私はコードの上に*例外をスローするのが好きではありません。 –

答えて

2

あなたはメソッドに型パラメータを追加し、元の例外を再スローできます

public static <T extends Exception> void handleException(
    T exception, 
    String errorMessage 
    ) throws T 
{ 
    LOGGER.error(errorMessage + "\n " + exception.getMessage()); 
    throw exception; 
} 

あなたはしかし、そのメッセージを変更することはできません。

メッセージを変更するには、新しいメッセージを作成する必要があります。つまり、メッセージのコンストラクターに必要な引数がわかっている必要があります。大部分のExceptionサブクラスはメッセージ文字列と "原因"例外を受け入れますが、すべてではありません。それでも、私たちはその前提にする場合:

public static <T extends Exception> void handleException(
    T exception, 
    String errorMessage 
    ) throws T 
{ 
    final String newMessage = errorMessage + "\n " + exception.getMessage(); 
    LOGGER.error(newMessage); 
    T newException = exception; 
    try { 
     newException = (T)exception.getClass() 
           .getConstructor(new Class[] { String.class, Exception.class }) 
           .newInstance(new Object[] { newMessage, exception}); 
    } catch (Exception) { 
    } 
    throw newException; 
} 

またはそれらの線に沿って何か...

+1

魅力的な作品です。ありがとうございました。 –

-2

なぜあなたはちょうどあなたが最初の場所になった例外を再スローしませんか?

例外をスローします。

これが要件と一致しない場合、あなたは例外からクラスを取得し、リフレクションを使用して、新しいインスタンスを作成しようとすることができます(切り抜いたコンストラクタがあるかもしれないので、間違って行くことができる)

はそれが

を役に立てば幸い
+0

私は、例外処理をある場所に集中させたいだけです。ロギングを記述し、コード全体に例外をスローするのではなく、メソッドで、私はそれがより論理的であることがわかりました。 –

関連する問題