spring有默认的exception处理方式,但是很多时候我们都需要自定义异常处理:
下面是spring中exception的结构:
spring默认是采用SimpleMappingExceptionResolver来处理异常,我们自定义异常的处理方式只需要继承DefaultHandlerException,复写doResolveException方法,在这里处理我们的异常处理方式:
1、自定义ExceptionHandler,将这个注册成bean:属于我们的自定义异常就返回错误信息,不属于我们自定义的异常,就重定向到错误页面
public class WbExceptionHandler extends DefaultHandlerExceptionResolver { private static final Logger logger = Logger.getLogger(WbExceptionHandler.class); @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { if (ex instanceof WbRuntimeException) { //判断如果是属于我们自定义的runtime异常,就是返回json格式的错误信息:设置response的响应错误码,添加json格式的错误信息 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", ex.getMessage()); return modelAndView; } else { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); try { //重定向到error的controller中 response.sendRedirect(request.getContextPath() + "/error"); } catch (IOException e) { logger.error(e.getMessage()); } return new ModelAndView(); } } }
public class UserNotExitException extends WbRuntimeException { public UserNotExitException(){ super("用户名或者密码错误"); } }
2、自定义runtime异常信息
public class WbRuntimeException extends RuntimeException { public WbRuntimeException(String message) { super(message); } public WbRuntimeException() { } ; }
3、在抛出异常的时候就抛出我们自定义的异常就可以得到异常信息了:
throw new UserNotExitException();
对应json请求的时候,获取错误信息:error: function (data) {console.log(data); var message = eval('(' + data.responseText + ')'); alert(message.error);
}
在web.xml中还可以配置错误代码指定页面:
<error-page> <error-code>404</error-code> <location>/WEB-INF/404_error.jsp</location> </error-page>