1

私は独自の例外クラスを作成し、アクション クラスでこの例外をスローしました。フィルターがあり、フィルターから渡された後にアクションによって要求が処理されます。アクション クラスが独自の例外をスローした場合、フィルターでキャッチされません。なぜこれが起こるのか教えてください。

これが私のフィルターです

public class myfilter implements Filter
{
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException
    {
        try
        {   
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;

            RequestDispatcher rd = req.getRequestDispatcher("/"+url);
            if(rd != null)
            {   
                rd.forward(request,response);
            }   
        }
        catch(MyException ex)
        {
            System.out.println("filter caught exp--"+ex.getMessage());
            ex.printStackTrace();
            throw new ServletException(ex.getMessage());
        }   
    }
    public void init(FilterConfig filterConfig)
    {
    }
    public void destroy()
    {
        System.out.println("--filter destroy--");
    }
}

私の構造体アクションクラスはこちら

public class eventaction extends Action
{
    public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws MyException
    {
        response.setContentType("text/html; charset=UTF-8");
        /*
            Statements
        */
        throw new MyException("exception");

    }
}

いくつかのトレースで記録された次の行

[14:50:22:480]|[07-04-2013]|[org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/].[action]]|[SEVERE]|[12]|: Servlet.service() for servlet action threw exception|MyException: Unable_to_add_event

MyException ではなくフィルターで一般的な例外をキャッチした場合、フィルターによってキャッチされます。なんで?

catch(Exception ex) //catch(MyException ex)
{
    System.out.println("filter caught exp--"+ex.getMessage());
    ex.printStackTrace();
    throw new ServletException(ex.getMessage());
}
4

2 に答える 2

1

ラップするServletExceptionか、同様のものにする必要があります。

例外の印刷クラス名が表示されます。

catch(Exception ex) {
    System.out.println(ex.getClass().getName() + " filter caught exp--"+ex.getMessage());         
    throw new ServletException(ex.getMessage());
}   

編集

catch(Exception ex) {
    Throwable t = ex.getCause();
    if (t != null && t instanceOf MyException) {
        MyException m = (MyException) t;
        //handle your exception.

    } else {
        //handle other cases
    }
}   
于 2013-07-04T09:31:00.383 に答える