action抛出自定义异常但未在过滤器中捕获

时间:2013-07-04 09:23:23

标签: java

我编写了自己的异常类,并且我在我的动作类中抛出了这个异常,我有一个过滤器,我的请求在从过滤器传递后由动作处理,如果我的动作类抛出我自己的异常它没有被捕获过滤。请让我知道为什么会这样。

这是我的过滤器

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--");
    }
}

我的struct action class在这里

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

如果我在我的过滤器中捕获了genric异常而不是MyException,它会被过滤器捕获。为什么?

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

2 个答案:

答案 0 :(得分: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
    }
}   

答案 1 :(得分:0)

在此处抛出IOExceptionServletException时,您正在捕获自定义异常类型。 如果try阻止永不抛出除MyExceptionServletException以外的IOException,您可能无法捕获该异常。

here

了解Exception hierarchy

修改:查看此图表。

enter image description here

正如您所看到的,Exception是Exception的超级类型。因此,当您使用Catch(Exception e)时,它会捕获 所有类型的例外,因为它是一种超级类型。在您的情况下,您的MyException属于IO异常所在的组。如果您想要捕获IOExceptionServletException您必须使用晚餐类型**而不是您的定制异常。*** *