异常分类
程序中异常分为两类为:预期异常(对象为空)和运行时异常RunTimeException(如除数为0),前者通过捕获异常从而获取异常信息;后者只能通过规范代码开发、测试等手动减少运行时异常
SSM项目中异常处理的过程
系统的Dao,service,controler出现异常都是通过throws Exception向上抛,最后由springMVC前端控制器交由异常处理器进行异常的处理
springMVC提供的处理方法
可以自定义异常类,继承Exception类;springmvc提供了全局异常处理器,一个系统只有一个全局异常处理器进行统一的异常处理,实现HandlerExceptionResolver接口的类就是全局异常处理器
//自定义异常类,继承Exception
public class CustomException extends Exception {
//异常信息
public String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public CustomException(String message){
super(message);
this.message=message;
}
}
全局异常处理器处理异常的思路
系统遇到异常时,在程序中手动抛出,dao抛给service,service抛给controller,controller抛给前端控制器,前端控制器调用全局异常处理器处理异常,全局异常处理器处理异常思路(解析异常类型):
- 如果该异常类型是系统自定义异常,直接取出异常信息,在错误页面展示
- 如果该异常类型不是系统自定义异常(则视为运行时异常),构造一个自定义的异常类型(”未知错误”)
//全局异常处理器
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
CustomException customException = null;
if(ex instanceof CustomException){
//是自定义异常
customException=(CustomException)ex;
} else {
//不是自定义异常
customException=new CustomException("未知错误");
}
//取出错误信息
String message = customException.getMessage();
ModelAndView modelAndView = new ModelAndView();
//将取出的错误信息返回到页面
//返回的页面
modelAndView.setViewName("items/error");
return modelAndView;
}
}
何时在表现层处理,何时在service层处理
- 如果和业务功能相关的异常,就在service层抛出
- 如果和业务功能无关的异常(输入字符的判断),就在controler中抛出
全局异常处理器的配置
只需将全局异常处理器配置到spring中即可
<!-- springMVC.xml -->
<!-- 全局异常处理器 -->
<bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>