对于一些小系统来讲,出现异常直接抛就行,甚至不规范的使用。
如果要规范使用,则可以引入自定义异常,统一异常处理和管理,service与controller错误解耦,不会被service返回的类型限制。
场景:
想要抛出异常:
if (keyIsExist) {
throw new RuntimeException("短信重复发送!");
return false;
}
引入自定义全局异常
步骤:
- 定义自定义异常类继承RuntimeException
- 统一封装异常处理类
- 统一异常拦截处理
定义自定义异常类继承RuntimeException
**
* 自定义异常
* 目的:统一处理异常信息
* 便于解耦,service与controller错误的解耦,不会被service返回的类型而限制
*
* @author Claw
* @date 2023/5/9 21:38.
*/
public class BusinessException extends RuntimeException {
private ResponseStatusEnum responseStatusEnum;
public BusinessException(ResponseStatusEnum responseStatusEnum) {
super("异常状态码为:" + responseStatusEnum.status()
+ ";具体异常信息为:" + responseStatusEnum.msg());
this.responseStatusEnum = responseStatusEnum;
}
public ResponseStatusEnum getResponseStatusEnum() {
return responseStatusEnum;
}
public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
this.responseStatusEnum = responseStatusEnum;
}
}
统一封装异常处理类
/**
* 优雅的处理异常,统一封装
* @author Claw
* @date 2023/5/9 21:38.
*/
public class GraceException {
public static void display(ResponseStatusEnum responseStatusEnum) {
throw new BusinessException(responseStatusEnum);
}
}
统一异常拦截处理
这一步是为了异常被容器捕获拦截,并以json的形式返回给前端。
/**
* 统一异常拦截处理
* 可以针对异常的类型进行捕获,然后返回json信息到前端
*
* @author Claw
* @date 2023/5/9 21:40.
*/
@ControllerAdvice
public class GraceExceptionHandler {
// 拦截 哪种类型的异常,我们需要拦截BusinessException的异常,所以写BusinessException类
@ExceptionHandler(BusinessException.class)
// 返回格式为json
@ResponseBody
public GraceJSONResult returnMyException(BusinessException e) {
e.printStackTrace();
return GraceJSONResult.exception(e.getResponseStatusEnum());
}
}
代码中出现的 GraceJSONResult 和 ResponseStatusEnum 一个是自定义的结果返回格式和状态码,自己定义即可。