处理麻烦,对用户来说也不太友好
我们都希望不用写过多的重复代码处理异常,又能提升用户体验。
这时候全局异常处理就显得很便捷很重要了
小伙伴们如果对异常还不熟悉的可以看看这篇文章
https://blog.csdn.net/rong09_13/article/details/128090748
Springboot对于异常的处理也做了不错的支持,它提供两个注解供我们使用
- @ControllerAdvice注解 :用来开启全局的异常捕获,
- @ExceptionHandler注解:说明捕获哪些异常,对那些异常进行处理
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(value =Exception.class)
public String exceptionHandler(Exception e){
System.out.println("发生了一个异常"+e);
return e.getMessage();
}
}
7.1 添加自定义异常与其他异常返回结果
我们在Result 类中添加如下两个方法来处理自定义异常和其他异常返回结果
//自定义异常返回的结果
public static <T> Result<T> bussinessErr(BusinessException e) {
Result<T> result = new Result<>();
result.setCode(e.getErrorCode());
result.setMsg(e.getErrorMsg());
result.setData(null);
return result;
}
//其他异常处理方法返回的结果
public static <T> Result<T> otherErr(ResultCode resultCode) {
Result<T> result = new Result<>();
result.setCode(resultCode.getCode());
result.setMsg(resultCode.getMsg());
result.setData(null);
return result;
}
7.2 自定义异常
新建com.xiezhr.exception包,并自定义异常类
public class BusinessException extends RuntimeException{
private String errorCode;
private String errorMsg;
public BusinessException() {
}
public BusinessException(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
7.3 全局异常处理
我们自定义一个全局异常处理类,来处理各种异常,包括自己定义的异常和内部异常 。
这样可以简化不少代码,不用自己对每个异常都使用try,catch的方式来实现
我们在com.xiezhr.exception
包下面添加全局异常处理类GlobalExceptionHandler
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理自定义异常
*
*/
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public<T> Result<T> bizExceptionHandler(BusinessException e) {
return Result.bussinessErr(e);
}
/**
* 处理其他异常
*
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result exceptionHandler(Exception e) {
return Result.otherErr(ResultCode.INTERNAL_SERVER_ERROR);
}
}
7.4 测试异常处理
我们在SysUserController 中添加如下代码来测试下异常,看看能不能捕获到
@RequestMapping("/getBusinessException")
public Result DeException(){
throw new BusinessException("400","我出错了");
}
@RequestMapping("/getException")
public Result Exception(){
Result result = new Result();
int a=1/0;
return result;
}
八、添加系统日志
日志记录应用程序的运行状态,通过日志开发者可以更好的了解应用程序的运行情况
当系统出现bug时,也能通过日志快速定位问题和解决问题
8.1 常用日志框架
① 常用日志框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
② 日志框架之间的关系
日志框架的设计类似于JDBC-数据库驱动的设计,提供了统一的接口抽象层,然后再由各个数据库厂商去实现它,
从而实现连接不同数据库(Oracle、MySQL、PostgreSQL、MongoD...)
日志门面(日志抽象层) |
日志实现 |
JCL SLF4j jboss-logging |
Log4j JUL(java.util.logging) Log4j2 Logback |
我们需要需要选择一个日志门面 和日志实现
springboot 默认选用SLF4j 和Logback
8.2 日志常用配置
① 日志输出分析
- 日期时间:精确到毫秒
- 日志级别:TRACE|DEBUG|INFO|WARN|ERR
- 进程ID:60236
- 分隔符:默认以---进行分割
- 线程名:由中括号括起来,如[ main]
- Logger名: 一般使用类名
- 日志内容
② 日志级别
日志级别由低到高如下
TRACE < DEBUG< INFO< WARN < ERROR
如果设置为 WARN
,则低于 WARN
的信息