我编写了自己的异常类,并且我在我的动作类中抛出了这个异常,我有一个过滤器,我的请求在从过滤器传递后由动作处理,如果我的动作类抛出我自己的异常它没有被捕获过滤。请让我知道为什么会这样。
这是我的过滤器
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());
}
答案 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)
在此处抛出IOException
和ServletException
时,您正在捕获自定义异常类型。
如果try
阻止永不抛出除MyException
或ServletException
以外的IOException
,您可能无法捕获该异常。
从here
了解Exception hierarchy
修改:查看此图表。
正如您所看到的,Exception是Exception的超级类型。因此,当您使用Catch(Exception e)
时,它会捕获
所有类型的例外,因为它是一种超级类型。在您的情况下,您的MyException
属于IO异常所在的组。如果您想要捕获IOException
或ServletException
您必须使用晚餐类型**而不是您的定制异常。*** *