我怎样才能捕获JSP文件中的异常?

时间:2015-08-16 18:05:26

标签: java spring jsp exception exception-handling

我在控制器中使用ExceptionHandler来捕获异常。

@ExceptionHandler(value = {Exception.class, RuntimeException.class})
public final ModelAndView globalExceptionHandler(final Exception exception) {
    ModelAndView modelAndView = new ModelAndView("error/500");
    modelAndView.addObject("tl_exception", errorSystem.processingError(exception));
    return modelAndView;
}

但是,例如,如果在jsp文件中我想从null对象获取数据,那就是异常而不是阴道。

我需要建议,如何在jsp文件中捕获异常?或者我只需要在控制器中捕获所有错误?

更新

最好的解决方案是放在web.xml中,以防错误。

<error-page>
    <location>/error</location>
</error-page>

创建需要处理来自请求的错误的控制器后:

@Controller
public final class ErrorController {
    @RequestMapping(value = "/error")
    public final ModelAndView globalErrorHandle(final HttpServletRequest request) {
       String page = "error/500";
       final String code = request.getAttribute("javax.servlet.error.status_code").toString();
       if (null != code && !code.isEmpty()) {                
            final Integer statusCode = Integer.parseInt(code);
            switch (statusCode) {
                case 404 : page = "error/404";
                case 403 : page = "error/403";
            }
        }
        return new modelAndView(page);
    }
}

2 个答案:

答案 0 :(得分:2)

添加到@astrohome回答,JSP还为您提供了为每个JSP指定错误页面的选项。每当页面抛出异常时,JSP容器都会自动调用错误页面。

要设置错误页面,请使用<%@ page errorPage="xxx" %>指令。

在错误处理上,您在上面提到的JSP包含指令<%@ page isErrorPage="true" %>

示例,假设您有一个JSP页面名称 main.jsp ,您正在尝试对空对象执行操作。

<强> main.jsp中

<%@ page errorPage="show-error.jsp" %>

<html>
<head>
   <title>Page on which Error Occurs</title>
</head>
<body>

</body>
</html>

显示-error.jsp文件

<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error</title>
</head>
<body>
<p>Exception stack trace:<% exception.printStackTrace(response.getWriter()); %>
</p>
</body>
</html>

答案 1 :(得分:1)

如果您只想重定向到错误页面,astrohome和Arpit提出的解决方案很好。

如果你真的想抓住它们并且能够做任何事情,你还有另外两种方法:

  1. 过滤器。声明自定义过滤器

    public class exceptFilter implements Filter {
        ...
        @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException
            try {
                fc.doFilter(req, resp);
            }
            catch (Exception ex) {
                // Exception processing ...
            }
        }
        ...
    }
    

    但要注意,当您发现异常时,可能已经提交了响应......

  2. 实现HandlerExceptionResolver bean。你会在Spring Framework Reference Manual中找到它的参考 - 它或多或少像全局@ExceptionHandler,但它甚至会在控制器动作之后起作用。