SpringBoot项目统一异常处理和统一日志处理
统一异常处理
本文章介绍三种异常处理:全局异常处理、特定异常处理、自定义异常处理
1、全局异常处理
如果是父子工程,在common子工程中,创建一个子模块common-utils,在子模块下创建一个handler包,在包中创建一个ExceptionHandler(此创建可以根据个人习惯创建,因为整个项目统一异常处理,最好放在公共模块中);如果是单个工程项目,就在主包下创建一个handler包,然后创建一个GlobalExceptionHandler类
(1)全局异常处理创建GlobalExceptionHandler类
/**
* 统一异常处理类
*/
import com.springboot1230.utils.ResultJson;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Component
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultJson error(Exception e){
e.printStackTrace();
return ResultJson.error().message("执行了全局异常处理..");
}
}
代码解析:
@ControllerAdvice:可以用在全局异常处理、全局数据绑定、全局请求数据预处理
@ExceptionHandler(Exception.class):这个注解表示,异常处理器,括号中的内容是代表出现什么异常会处理,此时代表出现所有异常都会处理
@ResponseBody:为了返回数据,当出现异常时,会执行error方法,返回一个异常信息,而不是返回一个500页面
(2)测试结果
在swagger-ui中测试处理方法是否生效,在controller中随便一个方法加入一个异常,比如 int i = 2/0
//根据id查询
@GetMapping("selectById/{id}")
public ResultJson selectById(@PathVariable String id){
EduTeacher eduTeacher = eduTeacherService.getById(id);
int i = 2/0;
return ResultJson.ok().data("teacher",eduTeacher);
}
测试结果
在ResponseBody中显示了异常处理的信息,说明执行了异常处理方法,这样就可以给用户一个较好的项目体验。
2、特定异常处理
和全局异常处理方法一样,在上一步的GlobalExceptionHandler类中,添加一个特定异常处理方法,处理指定的异常,拿上个举例,当方法中存在 int i=2/0时控制台报这样的异常
方法中这样写
//特定异常处理
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public ResultJson error(ArithmeticException e){
e.printStackTrace();
return ResultJson.error().message("执行了ArithmeticException异常处理");
}
测试结果
这里有一个机制,就是当出现异常的时候,会先去找有没有这个特定的异常处理,如果没有就执行全局异常处理方法
3、自定义异常处理
(1)创建一个自定义异常类
和全局异常处理的创建方法一样,在handler包下创建一个自定义异常处理类CustomException,并继承RuntimeException类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor //生成有参数的构造方法
@NoArgsConstructor //生成无参数的构造方法
public class CustomException extends RuntimeException {
private Integer code;//状态码
private String message;//异常信息
}
代码解析: @Data是lombok的注解,可以自动生成get/set方法
@AllArgsConstructor :生成有参数的构造方法
@NoArgsConstructor :生成无参数的构造方法
(2)在创建自定义异常处理方法
在第一个全局异常处理类中,添加自定义异常处理方法
//自定义异常处理
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResultJson error(CustomException e)