2011-09-14 8 views
13

TomcatやJettyのようなJavaサーブレットコンテナ内で発生するキャッチされない例外を検出する標準的な方法はありますか?ライブラリから来たサーブレットをたくさん走らせて、try/catchコードを簡単に置くことはできません。できるだけ一般的な方法で、Webアプリケーション(Jettyで実行される)の捕捉されない例外を、提供されたAPIを介してバグ追跡システムに捕捉してログに記録するのも良いでしょう。JavaサーブレットWebアプリケーションでキャッチされない例外を取得する方法

リダイレクトがカスタムエラーページの問題であるかどうかはわかりませんが、例外を記録する必要はありません。私たちはGWT-RPC経由ですべてを行い、ユーザーはエラーページを見ることはありません。

答えて

11

(デプロイメント記述子)には、<error-page>要素を使用して、例外タイプ別にエラーページを指定するか、HTTP response status codeを使用できます。例えば:NetBeansの中心の説明、Configuring Web Applications: Mapping Errors to Error Screens (The Java EE 6 Tutorial)(又はthe Java EE 5 Tutorial's versionを参照)上にmoseyため

<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> 

+3

エラー処理サーブレットコードは、 'javax.servlet.error.exception'属性の' request'オブジェクトから例外を取り出すことができます。例: 'request.getAttribute(" javax.servlet.error.exception ")' – nilskp

3

これはサーブレットコンテナで動作しますか、どこまでこのコール上流に行く必要があるだろうが、あなたはすべてキャッチされない例外を処理するハンドラを設定するにはThread静的setDefaultUncaughtExceptionHandlerメソッドを呼び出すことができるならば、100%はわかりません。

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'を使う方法です。 – nilskp

+1

上記のjavax.servlet.Filterソリューションは、実際にはサーブレット環境でうまく動作します。私はそれのためにweb.xmlを編集する必要はありません。 – David

+0

この例では、エラーをキャッチする副作用(throwableの非Exceptionサブクラスと例外を例外に変換する)が発生します。エラーはJVM自体に関する内部的な問題(OutOfMemoryError、ThreadDeathなど)です。 JVM自体はエラーを処理する必要があるため、throwableをキャッチしてJVMによって適切に処理されない例外に変換することは悪い習慣です。 (http://stackoverflow.com/questions/6083248/is-it-a-bad-practice-to-catch-throwable) –

関連する問題