思想
在代码中通常会有许多异常,就会使用到大量的try{……}catch(){……}
语句块,有时异常一旦改变就需要去修改catch语句块
而在框架中,为了避免这种情况,在框架中分出一块区域集中处理异常,使用aop的思想,代码中的异常只需要抛出即可
统一全局异常处理方案
会用到两个注解
@ExceptionHandler
@ControllerAdvice (控制器增强:给控制器类增加功能)
步骤
创建自定义异常类
创建一个普通类,作为全局异常处理类
- 在类上面加上@ExceptionHandler
- 在类定义方法上加@ControllerAdvice
创建处理异常的视图页面
在springmvc配置文件中加入组建扫描器和注解驱动
创建自定义异常类
例:创建MyUserException和它的子类NameException
public class MyUserException extends Exception{
public MyUserException() {
}
public MyUserException(String message) {
super(message);
}
}
//当用户姓名有问题时抛出的异常
public class NameException extends MyUserException {
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}
创建全局异常处理类
这个类和我们的controller控制器类是一样的,并且是在控制器类的上面增强了异常处理的功能
//控制器增强(增加异常处理功能)
@ControllerAdvice
public class GlobalExceptionHandler {
//定义方法,和controller中一样
@ExceptionHandler(NameException.class)
public ModelAndView doNameException(Exception e){
ModelAndView mv=new ModelAndView();
mv.addObject("why","姓名不能叫zs");
mv.setViewName("exception");
return mv;
}
// 处理其他未知异常,不加value就行
@ExceptionHandler
public ModelAndView doOtherException(Exception e){
ModelAndView mv=new ModelAndView();
mv.setViewName("exception");
return mv;
}
}
异常处理页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>exception:${why}</h1>
</body>
</html>
注解扫描器和注解驱动
<context:component-scan base-package="exception"/>
<mvc:annotation-driven/>
控制器抛出异常
假如注册的姓名叫zs就抛出异常
@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService service;
@RequestMapping("/addStudent")
public ModelAndView addStudent(Student student) throws NameException {
String tips="注册失败";
if("zs".equals(student.getName())){
throw new NameException("namewenti");
}
int i = service.addStudent(student);
if(i>0){
tips="注册成功";
}
ModelAndView mv=new ModelAndView();
mv.addObject("tips",tips);
//转发:显示的不受视图解析器限制
mv.setViewName("forward:/WEB-INF/jsp/result.jsp");
return mv;
}
}