2011-09-14 61 views
13

是否有一種標準方法來捕獲java servlet容器(如tomcat或Jetty)內發生的未捕獲異常?我們運行了很多來自庫的servlet,所以我們不能輕易放上try/catch代碼。這也很好,儘可能以通用的方式捕獲並記錄我們的Web應用程序(運行在Jetty中)的所有未捕獲的異常,並通過API提供給我們的錯誤跟蹤器。如何在Java Servlet Web應用程序中捕獲未捕獲的異常

請不要我只需要記錄異常,重定向是否發佈到自定義錯誤頁面不會幫助我。我們通過GWT-RPC完成所有工作,因此用戶永遠不會看到錯誤頁面。

回答

11

web.xml(部署描述符)中,可以使用<error-page>元素按異常類型或HTTP response status code指定錯誤頁面。例如:

<error-page> 
    <error-code>404</error-code> 
    <location>/error/404.html</location> 
</error-page> 
<error-page> 
    <exception-type>com.example.PebkacException</exception-type> 
    <location>/error/UserError.html</location> 
</error-page> 

爲一個NetBeans爲中心的描述中,莫西超過到Configuring Web Applications: Mapping Errors to Error Screens (The Java EE 6 Tutorial)(或見the Java EE 5 Tutorial's version)。

+3

值得指出的是,錯誤處理servlet代碼可以從'javax.servlet.error.exception'屬性中的'request'對象中檢索異常。例如:'request.getAttribute(「javax.servlet.error.exception」)' – nilskp

3

不是100%肯定這是否會與一個servlet容器,不然怎麼上游此調用工作至今就需要去,但你可以叫上Thread靜態setDefaultUncaughtExceptionHandler方法來設置一個處理程序將處理所有未捕獲的異常。

13

我認爲自定義過濾器實際上效果最好。

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     chain.doFilter(request, response); 
    } catch (Throwable e) { 
     doCustomErrorLogging(e); 
     if (e instanceof IOException) { 
      throw (IOException) e; 
     } else if (e instanceof ServletException) { 
      throw (ServletException) e; 
     } else if (e instanceof RuntimeException) { 
      throw (RuntimeException) e; 
     } else { 
      //This should never be hit 
      throw new RuntimeException("Unexpected Exception", e); 
     } 
    } 
} 
+2

有關使用'error-page'的帖子是在servlet環境中執行此操作的正確方法。 – nilskp

+1

實際上,上面的javax.servlet.Filter解決方案在servlet環境中工作得很好。而且我喜歡這樣一個事實,即我們不必爲它編輯web.xml。 – David

+0

這個例子會導致捕獲Errors(一個非throw類的非Exception子類並將它們轉換爲Exceptions)的副作用。由於錯誤是與JVM本身相關的內部問題(如OutOfMemoryError或ThreadDeath)。由於JVM本身需要處理錯誤,因此它是一種糟糕的做法,可以捕獲throwables並將它們轉換爲JVM無法正確處理的Exception。 (http://stackoverflow.com/questions/6083248/is-it-a-bad-practice-to-catch-throwable) –