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> 

 

posted @ 2016-03-24 13:40  蜗牛之幻想  阅读(223)  评论(0编辑  收藏  举报