2008-12-21 75 views
6

我想弄清楚一個乾淨的方法來攔截在我的應用程序中發生的未捕獲的異常。如何攔截Tomcat上未捕獲的異常?

我有log4j配置爲記錄正常的應用程序流和捕獲異常,所以這是照顧。現在,我有一個類,它接收所有錯誤級別的消息,並將它們添加到隊列中以批量發送電子郵件。

理想情況下,我希望有一種方法可以攔截未捕獲的異常,以便我可以將它們傳遞給同一個'郵件批處理'隊列,但如果這不是可行的,我當然可以接受建議。

我對JBoss上的LogInterceptors很熟悉,但是這個項目使用Tomcat。有什麼辦法可以解決這個問題嗎?有沒有一個Tomcat的LogInterceptor equivelant?我應該嘗試將Tomcat日誌記錄重定向到自定義appender嗎? (如果是這樣 - 對此有任何提示?)其他一些想法?

我覺得這個現在已經解決了,所以我希望挖掘一些集體智慧。謝謝大家,提前。

回答

5

根據J2EE 1.4規範,servlet中的未捕獲異常可能被轉發到部署描述符中定義的錯誤頁面。發生這種情況時,頁面實現將接收原始的請求和響應對象,並添加一個名爲javax.servlet.error.exception的包含異常對象的請求屬性。

也就是說,我實際上並沒有對Tomcat和大部分Web應用程序進行處理,這些應用程序在Web服務器級別轉發到一般錯誤頁面。

編輯:剛剛試了一下我的本地服務器上,添加以下到我的web.xml之後,它像宣傳的那樣:

<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/dumpRequest.jsp</location> 
</error-page> 
1

這不是針對Tomcat,但你可以set uncaught exception handlers on a per-thread basis

根據您的應用程序的設置,您可以在處理請求的方法的頂部設置它。您可能必須每次都這樣做,因爲您可能會收到每個請求的線索。

設置它的好地方是在某種前端控制器中。

+0

我想這不會工作,因爲即使您的應用程序沒有,tomcat也會捕獲所有異常。如果它不在其線程池中的線程將繼續死於Web應用程序的錯誤。 – 2009-06-15 19:11:47