我正在編寫一個獨立的應用程序,它必須啓動並長時間無人值守運行。除了有例外情況使其停止之外,它還需要記錄具有足夠信息的例外情況,以便支持人員瞭解發生的情況並繼續進行。我的異常記錄方面記錄了兩次相同的異常
因此,每個異常都包裝在運行時異常中,然後拋出由應用程序的不同部分記錄。我使用aop:config標籤來創建一個方面來記錄應用程序其餘部分拋出的運行時異常。然後這個異常將調用堆棧傳遞給一個UncaughtExceptionHandler以靜靜地結束這個異常。 但是,相同的異常被重複捕獲並記錄(每個異常都由單獨的線程寫入,並轉到單獨的日誌文件中)。在調試器中,兩個例外都具有相同的ID。
我的ApplicationContext已基本爲這樣的:
<aop:config> <aop:aspect ref="exceptionLoggingAspect"> <aop:after-throwing method="logException" pointcut="execution(* *.*(..))" throwing="exception" /> </aop:aspect> </aop:config>
的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());
}
}
我已經通過限制切入點,以單一封裝試驗,並從該包中拋出一個異常(不是包含異常日誌記錄的包),但它仍然記錄兩次。 這個想法有什麼根本錯誤嗎?建議感激。