一、异常分类
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主
要通过规范代码开发、测试通过手段减少运行时异常的发生。
二、SpringMVC异常处理方式
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。
springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
三、自定义异常处理
1、自定义异常类
对不同的异常类型定义异常类,继承Exception。
public class ItemsException extends Exception {
private String message;//异常信息
//构造方法
public ItemsException(String message){
this.message = message;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、全局的异常处理器
(1)处理方式:系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
(2)全局异常处理器处理思路:
解析出异常类型,如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示,如果该异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
(3)springmvc提供一个HandlerExceptionResolver接口.
public class MyException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {
ItemsException itemsException = null;
//解析出异常类型
//如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
if(e instanceof ItemsException){
itemsException =(ItemsException) e;
}else{
//如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
itemsException = new ItemsException("未知错误");
}
//获取异常信息
String message = itemsException.getMessage();
//将异常信息添加到ModelAndView
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",message);
//将view添加到modelAndView
modelAndView.setViewName("error");
return modelAndView;
}
}
3、编写错误页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>自定义异常</title>
</head>
<body>
${message}
</body>
</html>
4、在SpringMVC的配置文件中配置全局异常处理器
<bean class="com.jack.Exception.MyException"/>
5、异常测试
controller异常:
public ModelAndView queryItemById(@RequestParam(value = "id") Integer item_id) throws Exception{
ItemsCustom itemsExtend = itemsService.queryItesmById(item_id);
if(itemsExtend == null){
throw new ItemsException("商品信息不存在");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsExtend",itemsExtend);
modelAndView.setViewName("updateitem");
return modelAndView;
}
service异常:
@Override
public ItemsCustom queryItesmById(Integer id) throws Exception {
ItemsCustom itemsCustom= itemsMapper.queryItesmById(id);
if(itemsCustom == null){
new ItemsException("商品信息不存在");
}
return itemsCustom;
}