Spring MVC 异常处理有3种方式

来源:互联网 发布:阿里云服务器怎么租 编辑:程序博客网 时间:2024/06/05 08:48
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>