私はスタンドアロン アプリケーションを作成しています。このアプリケーションは、起動して長時間放置する必要があります。例外によって停止するのではなく、サポート担当者が何が起こったのかを把握して続行できるように、十分な情報を含めて例外をログに記録する必要があります。
その結果、各例外は実行時例外にラップされ、スローされて、アプリケーションの別の部分によってログに記録されます。aop:config タグを使用して、アプリケーションの残りの部分によってスローされたランタイム例外をログに記録するアスペクトを作成しています。その後、例外は UncaughtExceptionHandler までコール スタックを上に移動し、例外をサイレントに終了します。ただし、同じ例外が繰り返しキャッチされ、ログに記録されます (各例外は個別のスレッドによって書き込まれ、個別のログ ファイルに記録されます)。デバッガーでは、両方の例外の ID が同じです。
私のapplicationContextはこれの基本です:
<aop:config> <aop:aspect ref="exceptionLoggingAspect"> <aop:after-throwing method="logException" pointcut="execution(* *.*(..))" throwing="例外" /> </aop:アスペクト> </aop:構成>
UncaughtExceptionHandler は、少なくとも私がそれを機能させるまでは、同様に基本的です:
private void setUncaughtExceptionHandler()
{
final Handler handler = new Handler();
Thread.setDefaultUncaughtExceptionHandler(handler);
}
class Handler implements Thread.UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("Throwable: " + e.getMessage());
System.out.println(t.toString());
}
}
ポイントカットを 1 つのパッケージに制限し、そのパッケージ (例外ログが含まれているパッケージではない) から例外をスローして実験しましたが、それでも 2 回ログに記録されます。この考えに何か根本的な間違いはありますか? アドバイスをいただければ幸いです。