Java 操作引发自定义异常,但未在筛选器中捕获

Java 操作引发自定义异常,但未在筛选器中捕获,java,Java,我编写了我自己的异常类,我在我的action类中抛出了这个异常,我有一个筛选器,我的请求在从筛选器传递后由action处理,如果我的action类抛出了我自己的异常,它不会被筛选器捕获。请让我知道为什么会这样 这是我的过滤器 public class myfilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)thr

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

这是我的过滤器

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类在这里

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

必须将其包装到
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
    }
}   

必须将其包装到
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
    }
}   

在这里抛出
IOException
ServletException
时,您正在捕获自定义异常类型。 如果
try
块从不抛出
MyException
而不是
ServletException
IOException
则可能无法捕获该异常

从中阅读有关异常层次结构的信息

编辑:查看此图表

正如您所看到的,异常是异常类型。因此,当您使用
Catch(异常e)
时,它将捕获
所有类型的异常,因为它是super类型。在您的情况下,您的
MyException
属于IO异常所在的组。如果您想捕获
IOException
ServletException
您必须使用**的super类型,而不是自定义异常。****

在这里抛出
IOException
ServletException
时,您正在捕获自定义异常类型。 如果
try
块从不抛出
MyException
而不是
ServletException
IOException
则可能无法捕获该异常

从中阅读有关异常层次结构的信息

编辑:查看此图表

正如您所看到的,异常是异常类型。因此,当您使用
Catch(异常e)
时,它将捕获

所有类型的异常,因为它是super类型。在您的情况下,您的
MyException
属于IO异常所在的组。如果您想捕获
IOException
ServletException
您必须使用**的super类型,而不是自定义异常。****

我不确定此筛选器的用途,但您似乎在为某种任务滥用此筛选器。。。过滤器是一个可移动的组件,用于向应用程序添加某些功能(如日志记录或身份验证),但您的过滤器要么转发,要么抛出异常。筛选器链中的下一个筛选器从未被调用(
chain.doFilter(…)
)。我正在使用此筛选器进行url筛选,我在这里没有提到我的业务逻辑。。。。。。。。。我没有其他的过滤器在那之后这个过滤器。所以我没有使用chain.doFilter。。k、 .我不知道这个过滤器是干什么用的,但你似乎在滥用这个过滤器来完成某种任务。。。过滤器是一个可移动的组件,用于向应用程序添加某些功能(如日志记录或身份验证),但您的过滤器要么转发,要么抛出异常。筛选器链中的下一个筛选器从未被调用(
chain.doFilter(…)
)。我正在使用此筛选器进行url筛选,我在这里没有提到我的业务逻辑。。。。。。。。。我没有其他的过滤器在那之后这个过滤器。所以我没有使用chain.doFilter。。k、 .这里我使用requestdispatcher,它将转发到我提到的操作。这让我感到异常。我的问题是,它不会被过滤器捕获,如果我捕获为异常,它可以被捕获。。。明白了吗?@aravind我就是这么说的。请看我的编辑部分。正如您所建议的,如果我捕获为servlet异常,它可以捕获。。(即)请求调度器仅抛出servlet异常。。ri8???如果您真的想从MyException中捕获ServletException,请通过扩展ServletException@aravind对如果您想在一个catch块中捕获多个异常类型,您可以在这里使用requestdispatcher,将其转发到我提到的操作。这让我感到异常。我的问题是,它不会被过滤器捕获,如果我捕获为异常,它可以被捕获。。。明白了吗?@aravind我就是这么说的。请看我的编辑部分。正如您所建议的,如果我捕获为servlet异常,它可以捕获。。(即)请求调度器仅抛出servlet异常。。ri8???如果您真的想从MyException中捕获ServletException,请通过扩展ServletException@aravind对如果您想在一个catch块中捕获多个异常类型,您可以按照您的建议将其放到print中,但这里的示例是.getClass().getName是servletException。。。下面是日志。。。。请参考这个类--javax.servlet.ServletException--exp--com.MyException:Canable_to_add_event这就是我要说的。在这里,将任何异常包装到Servlet异常中是一种很好的做法。因此,您可以通过只捕获ServletException来处理任何情况如果我必须处理MyException,那么如何处理这个。。。。因为exeption实例将只是一个servlet异常,而不是MyException的实例。。。。K..我已经做了一次尝试的副捕获(MyException){}捕获(Exception){}捕获(Exception){},这里从请求分派器抛出异常。如果我删除这个,也就是说,如果我只使用捕获(MyException){},它不会捕获,并将我的异常转发到我在web.xml中提到的错误页面。。这是真的吗。。在这里,我非常深入地阐述了我的场景。这种包装机制使代码具有可伸缩性和可读性。您可以抛出任何东西,而抛出的任何东西都会使servlet工作不正确,因此不同类型的异常会按照您的建议以统一的方式进行处理