文章目录
- 1. 异常分析
- 2. 异常处理器
- 2.1 异常处理器核心
- 2.2 异常处理顺序
- 3. 自定义异常
1. 异常分析
问题:
程序允许不免的在各层都可能会产生异常,我们该如何处理这些异常? 如果只是在方法里面单独使用 try… catch… 语句去一个一个的进行捕捉处理的话,那毫无疑问是不现实的,因为异常数量是非常庞大的并且对于异常的出现种类是不可预料的,于是我们可以使用Spring框架提供的异常处理器进行处理。
解决: 使用异常处理器在表现层进行统一处理(异常通过表现层进行逐层调用, 最后也都会抛回到表现层当中, 所以一般可以写在表现层进行处理)
2. 异常处理器
2.1 异常处理器核心
@ControllerAdvice: 声明其为异常处理器类, 用来处理系统当中的异常
@ResponseBody: 声明其返回数据放在返回体当中(用于返回异常处理之后的数据交给前端)
@RestControllerAdvice = @ControllerAdvice + @ResponseBody
关键: 在每个异常处理方法的上面需要使用对应注解声明其处理异常的种类
@ExceptionHandler(xxx.class)
@ControllerAdvice // 注意此类需要让Spring配置类扫描
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) // 处理全部异常
public String doException(Exception ex){ // 用形参来接收异常
/*
1. 记录日志(错误堆栈)
2. 发送邮件 -- 开发人员
3. 发送邮件 -- 运维人员
*/
System.out.println(ex.getMessage());
return "发生了Exception类型的异常.....";
}
}
Controller层
@RestController
public class AController {
@RequestMapping("/TestA")
public String TestA(){
System.out.println("This is Test A");
int x = 1 / 0;
return "Successful connect TestA .......";
}
}
处理结果
2.2 异常处理顺序
异常处理若具有包含关系,则会优先匹配更精确的处理器(即优先处理子类, 若子类不匹配再逐渐向上匹配)
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) // 处理全部异常
public String doException(Exception ex){ // 用形参来接收异常
System.out.println(ex.getMessage());
System.out.println("发生了Exception类型的异常.....");
return "发生了Exception类型的异常.....";
}
@ExceptionHandler(ArithmeticException.class) // 处理算术异常
public String doZeroException(ArithmeticException ex){ // 用形参来接收异常
System.out.println(ex.getMessage());
System.out.println("发生了ArithmeticException类型的异常.....");
return "发生了ArithmeticException类型的异常.....";
}
}
3. 自定义异常
用户可以根据自己的项目设置对应特定的异常然后再进行处理
public class MyException extends Exception{
Integer id;
public MyException(Integer id, String message){
super(message); // 利用父类注明异常信息
this.id = id;
}
@Override
public String toString() {
return "异常的ID为:" + id + "\n" +
"异常的详细信息为" + getMessage();
}
}
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class) // 处理自定义异常
public String MyException(MyException ex){
System.out.println(ex.getMessage());
return "自定义异常";
}
}
@RestController
public class AController {
@RequestMapping("/TestA")
public String TestA() throws MyException {
System.out.println("This is Test A");
throw new MyException(101, "101号自定义异常.....");
}
}