springmvc 全局异常解决方案

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

1.自定义异常类:

package cn.itcast.ssm.exception;  
  
public class CustomerException extends Exception{  
    private String message;//异常信息  
    public CustomerException(String message){  
        this.message=message;  
    }  
    public String getMessage() {  
        return message;  
    }  
    public void setMessage(String message) {  
        this.message = message;  
    }  
}  

2.定义一个全局异常处理器实现HandlerExceptionResolver接口

思路:系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。

全局异常处理器:解析出异常类型,如果该异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示,如果该异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)

package cn.itcast.ssm.exception;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.web.servlet.HandlerExceptionResolver;  
import org.springframework.web.servlet.ModelAndView;  
  
public class CustomerExceptionResolver implements HandlerExceptionResolver{  
    public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  
          
//      解析出异常类型  
//      如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示  
//      如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)  
        CustomerException customerException=null;  
        if(ex instanceof CustomerException){  
            customerException=(CustomerException)ex;  
        }else{  
            customerException=new CustomerException("未知错误!");  
        }  
        String message = customerException.getMessage();  
        ModelAndView modelAndView=new ModelAndView();  
        modelAndView.addObject("message", message);  
        modelAndView.setViewName("error");  
        return modelAndView;  
    }  
  
}  

如果出现错误就转发到错误页面error.jsp,直接在error.jsp使用EL表达式获取异常信息显示:${message} 

3.在sprimgmvc.xml中定义全局异常处理器类(与普通的handler配置基本相同)

<!-- 全局异常处理 -->  
<bean class="cn.itcast.ssm.exception.CustomerExceptionResolver"></bean>  

4.进行测试:对于修改页面抛出抛出异常信息:

1).controller层抛出异常

2).service层抛出异常信息 

3)访问:

posted @ 2017-09-13 16:06  jlustone  阅读(487)  评论(0编辑  收藏  举报