提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
#博学谷IT学技术支持#
- 在三层架构开发中,表现层,业务层,数据层存在一个关系,就是表现层去调用业务层、业务层去调用数据层的关系。这将导致最终所有的异常都会抛给表现层来处理,最简单的方法使用try/catch进行异常捕捉。
- 当方法很多,每个都需要 try catch,代码会显得臃肿,写起来也比较麻烦。这时就需要进行统一的异常处理。
一、新建异常结果类
//自动生成get、set方法
@Data
//生成一个无参数的构造方法
@NoArgsConstructor
//会生成一个包含所有变量的构造方法,默认生成的方法是 public 的
@AllArgsConstructor
@Builder
//vo是用来做数据响应模块
public class ErrorResult {
private String errCode = "999999";
private String errMessage;
public static ErrorResult error() {
//lombok创建对象的方式,和实例化是一样的
return ErrorResult.builder().errCode("999999").errMessage("系统异常稍后再试").build();
}
public static ErrorResult fail() {
return ErrorResult.builder().errCode("000001").errMessage("发送验证码失败").build();
}
public static ErrorResult loginError() {
return ErrorResult.builder().errCode("000002").errMessage("验证码失效").build();
}
......
}
}
二、自定义异常
/**
* 自定义异常
*/
@Data
public class BusinessException extends RuntimeException{
private ErrorResult errorResult;
public BusinessException(ErrorResult errorResult){
super(errorResult.getErrMessage());
this.errorResult = errorResult;
}
}
三、统一异常处理
- @ControllerAdvice
用于修饰类,表示该类是Controller的全局配置类 - @ExceptionHandler(BusinessException.class)
用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常
/**
* 自定义统一异常处理
* 1.通过注解,声明异常处理
* 2.编写方法,在方法内部处理异常,构造响应数据
* 3.方法上编写注解,指定此方法可以处理的异常类型
*/
//用于修饰类,表示该类是Controller的全局配置类
@ControllerAdvice
public class ExceptionAdvice {
//用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常
@ExceptionHandler(BusinessException.class)//自定义BusinessException
public ResponseEntity handlerException(BusinessException be){
be.printStackTrace();
ErrorResult errorResult = be.getErrorResult();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResult);
}
@ExceptionHandler(Exception.class)//Exceptionr.classs的作用是代表异常的类型,这里Exception就代表全部的类型
public ResponseEntity handlerException1(Exception be){
be.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ErrorResult.error());
}
}