系统中异常包含两种:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范化代码开发、测试手段减少运行时异常的发生。
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常异常处理器ExceptionResoler进行异常处理。
SpringMVC提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
自定义异常类:
对不同的异常类型定义异常类。集成Exception。自定义异常类,针对预期的异常,需要在程序中抛出此类的异常。
public class SelfException extends Exception{ public String message; public SelfException(String message){ super(message); this.message=message; } public String getMessage(){ return message; } public void setMessage(String message){ this.message=message; } }
全局异常处理器:
全局异常处理器处理思路:解析异常类型。
若该异常类是系统自定义的异常,直接取出异常信息,在错误页面展示。
若该异常类型不是系统自定义的异常,则构造一个自定义的异常类型(信息为“未知错误”)
编码:SpringMVC提供了一个HandlerExceptionResolver接口。
public class SelfExceptionResolver implements HandlerExceptionResolver{ public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex){ //handler就是处理器适配器要执行handler对象(只有method) String message=null; if(ex instanceof SelfException){ message=((SelfException)ex).getMessage(); }else{ message="未知错误"; } //或 SelfException self=null; if(ex instanceof SelfException){ self=(SelfException)ex; }else{ self=new SelfException("未知错误"); } String message=self.getMessage(); ModelAndView mav=new ModelAndView(); //将错误信息传到页面 mav.addObject("msg",message); //执行错误页面 mav.setViewName("error"); return mav; } }
在springmvc.xml中配置全局异常处理器。
<!-- 全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器 --> <bean class="cn.ccir.test.exception.SelfExceptionResolver"></bean>