2011-11-17 40 views
0

我正在編寫一個獨立的應用程序,它必須啓動並長時間無人值守運行。除了有例外情況使其停止之外,它還需要記錄具有足夠信息的例外情況,以便支持人員瞭解發生的情況並繼續進行。我的異常記錄方面記錄了兩次相同的異常

因此,每個異常都包裝在運行時異常中,然後拋出由應用程序的不同部分記錄。我使用aop:config標籤來創建一個方面來記錄應用程序其餘部分拋出的運行時異常。然後這個異常將調用堆棧傳遞給一個UncaughtExceptionHandler以靜靜地結束這個異常。 但是,相同的異常被重複捕獲並記錄(每個異常都由單獨的線程寫入,並轉到單獨的日誌文件中)。在調試器中,兩個例外都具有相同的ID。

我的ApplicationContext已基本爲這樣的:

 
    &ltaop:config> 
     &ltaop:aspect ref="exceptionLoggingAspect"> 
      &ltaop: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()); 
    } 
} 

我已經通過限制切入點,以單一封裝試驗,並從該包中拋出一個異常(不是包含異常日誌記錄的包),但它仍然記錄兩次。 這個想法有什麼根本錯誤嗎?建議感激。

回答

0

想過這個之後,決定不需要方面,只是混淆了這個問題。我將日誌記錄添加到UncaughtExceptionHandler,現在它記錄單個異常。我仍然不知道爲什麼相同的異常不止一次被記錄。