Spring MVC 异常处理优解
Spring MVC 异常处理有3种方式
1.Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2.Spring MVC异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3.@ExceptionHandler注解实现异常处理;
第一种方式:使用SimpleMappingExceptionResolver能够准确显示定义的异常处理页面,进行异常处理,具有集成简单、有良好的扩展性,因为是基于配置的对已有的代码没有侵入性等优点。但是该方法仅仅能够获取到异常信息,对于其他数据的情况不适用。
第二种方式:使用实现HandlerExceptionResolver接口的异常处理进行异常处理,具有集成简单、良好的扩展性、对已有代码没有侵入性等优点。同时由于自定义实现,我们可以在处理异常时进行额外的处理(日志的记录、异常信息的国际化等)。
第三种方式:使用注解方式实现异常处理,同样十分灵活,不过这种方式需要在每个controller上都需注解,解决方案是增加一个BaseController类,使用@ExceptionHandler注解声明异常处理,其他controller都继承它。
综合考虑,第二种、第三种方式比较实用,可以返回json结构数据,而且可以良好的处理异常,并对现有代码没有侵入性,但需要对每一个controller实现它的方法
现有系统中已经使用第二种@ExceptionHandler注解实现异常处理,故而采用在此基础上加入异常处理、返回异常信息,并加入日志处理,再配合使用error-page即可,所以运行时异常不需要在控制器里面 try catch。
使用方式:
第一步:BaseController实现异常处理、日志处理,每个Controller继承BaseController。
BaseController代码:
public abstract class BaseController { private static final Logger log = LoggerFactory.getLogger(BaseController.class); @ExceptionHandler public ModelAndView exception(HttpServletRequest request, Exception ex) { //简短的错误信息 String errInfo = ""; // 根据不同的异常类型进行不同处理 if (ex instanceof DataAccessException) { errInfo = "数据库操作失败!"; } else if (ex instanceof NullPointerException) { errInfo = "调用了未经初始化的对象或者是不存在的对象!"; } else if (ex instanceof IOException) { errInfo = "IO异常!"; } else if (ex instanceof ClassNotFoundException) { errInfo = "指定的类不存在!"; } else if (ex instanceof ArithmeticException) { errInfo = "数学运算异常!"; } else if (ex instanceof ArrayIndexOutOfBoundsException) { errInfo = "数组下标越界!"; } else if (ex instanceof IllegalArgumentException) { errInfo = "方法的参数错误!"; } else if (ex instanceof ClassCastException) { errInfo = "类型强制转换错误!"; } else if (ex instanceof SecurityException) { errInfo = "违背安全原则异常!"; } else if (ex instanceof SQLException) { errInfo = "操作数据库异常!"; } else if (ex.getClass().equals(NoSuchMethodError.class)) { errInfo = "方法末找到异常!"; } else if (ex.getClass().equals(InternalError.class)) { errInfo = "Java虚拟机发生了内部错误"; } else { errInfo = "程序内部错误,操作失败!" ; }
// 添加自己的异常处理逻辑,如日志记录 log.debug("异常信息:" + errInfo, ex); Map<String, Object> attributes = new HashMap<String, Object>(); attributes.put("code", 0); attributes.put("msg", "抱歉,请稍后重试或联系管理员!"); FastJsonJsonView view = new FastJsonJsonView(); view.setAttributesMap(attributes); ModelAndView result = new ModelAndView(); result.setView(view); return result; } }
第二步:web.xml中加入错误页处理
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/500.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page>