您的位置:首页 > 编程语言 > Java开发

Spring MVC 异常处理优解

2016-03-24 13:40 447 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: