我在控制器中使用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);
}
}
答案 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提出的解决方案很好。
如果你真的想抓住它们并且能够做任何事情,你还有另外两种方法:
过滤器。声明自定义过滤器
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 ...
}
}
...
}
但要注意,当您发现异常时,可能已经提交了响应......
实现HandlerExceptionResolver
bean。你会在Spring Framework Reference Manual中找到它的参考 - 它或多或少像全局@ExceptionHandler
,但它甚至会在控制器动作之后起作用。