SprnigMVC的统一异常处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。这篇博文主要总结一下SpringMVC中如何统一处理异常。

其中实现的方法分别包括以下:

序号 实现方式 备注
1 实现SimpleMapperExceptionResolver 配置文件中配置
2 实现HandleExceptionResolver接口 配置实现装配bena
3 @ExceptionHandler注解 侵入式代理,不建议使用

装配SimpleMapperHandlerResolver对象

在spring-mvc的配置文件中,配置该对象即可,具体信息请 参考注释

    
    
    
        
        
        
        
        
        
            
                /error/datavalidate
            
        
    

其中DataValidateException是自定义的异常类,其代码如下

public class DataValidateException extends RuntimeException {

    private String message;
    
    public DataValidateException(String message) {
        super(message);
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

然后在Controller层或者Service层,以及DAO层来尝试抛出异常,可查看是否跳转到异常处理页面

实现HandlerExceptionResolver接口

实现此接口,需要实现相应的方法,在此代码中可以判断抛出的异常类型,来实现自定义异常处理,如下

public class CustomHandleExceptionResolver implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        if (ex instanceof DataValidateException) {
            System.out.println("发生了自定义异常");
        }
        if (ex instanceof NullPointerException){
            System.out.println("发生了空指针异常");
        }
        
        ModelAndView modelAndView=new ModelAndView();
        return modelAndView;
    }
}

使用@ExceptionHandler注解

首先写个BaseController类,并在类中使用@ExceptionHandler注解声明异常处理的方法,如:

public class BaseController { 
    @ExceptionHandler  
    public String exp(HttpServletRequest request, Exception ex) { 
    //TODO 异常处理
    }
}

然后将所有需要异常处理的Controller都继承这个BaseController,虽然从执行来看,不需要配置什么东西,但是代码有侵入性,需要异常处理的Controller都要继承它才行。在以后的修改,远远不如使用配置文件来得方便。

参考文档:http://blog.csdn.net/eson_15/article/details/51731567

你可能感兴趣的:(SprnigMVC的统一异常处理)