3

サーブレットと JSP で開発された Web アプリがあります。IllegalArgumentException不正なパラメーターを挿入した場合にスローするようにアプリを構成しました。次に、web.xml ファイルを次のように構成しました。

<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
</error-page>

私が a を上げると404 error、それは機能して を呼び出しますerror.jspが、私が a を上げるとjava.lang.IllegalArgumentException、それは機能せず、blank page代わりに がありerror.jspます。なんで?

サーバーは Glassfish であり、ログは実際に IllegalArgumentException が発生したことを示しています。

4

3 に答える 3

7

捕まえて抑えるのではなく、手放してください。

つまり、しないでください:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (IllegalArgumentException e) {
        e.printStackTrace(); // Or something else which totally suppresses the exception.
    }
}

しかし、むしろそれを手放してください:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doSomethingWhichMayThrowException();
}

または、実際にロギングなどのためにそれをキャッチするつもりだった場合 (そのためにフィルターを使用したいのですが)、それを再スローします。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        throw e;
    }
}

または、実行時例外でない場合は、ラップされた状態で再スローしますServletException。コンテナーによって自動的にラップ解除されます。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        doSomethingWhichMayThrowException();
    } catch (NotARuntimeException e) {
        throw new ServletException(e);
    }
}

以下も参照してください。

于 2013-04-12T14:27:03.833 に答える
0

今日も同じ問題があります。(JavaEE 7 および Glassfish 4.0)

問題は、フレームワークがクラ​​スではなく文字列としてチェックしているようです。

文字列ベースのチェック (仮説)

例外が発生した場合、文字列としてe.getClass()比較さ<exception-type>れます。したがって、継承を使用することはできません。

ネストされたクラスは、'.' ではなく '$' として指定する必要があることに注意してください。(getClass() メソッドと同じ)。

クラスベースのチェック

フレームワークはクラスのインスタンスを作成し、<exception-type>テキストはそれを参照し、class.isInstance()チェックに使用されます。

これにはリフレクションが必要であり、ポリシー ファイルが壊れる可能性があります。

この対応で今後の問題が解決することを願っています。

于 2014-06-11T21:19:01.247 に答える