前言
在项目架构搭建中我们一般要进行统一异常处理,这样就不需要我们在程序中到处try catch捕捉异常给前端,只需要统一封装后携带异常信息throw出去,程序自动捕捉异常通过统一消息体封装后返回导前端即可,下面是具体步骤,大家有需要可以复制到自己的项目中使用。
步骤
1、首先封装一个统一返回体类R,用于捕捉异常后返回给前端,类名大家可以自定义
/**
* 统一返回体
* @param <T>
*/
@Data
@NoArgsConstructor
public class R<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功
*/
public static final int SUCCESS = 200;
/**
* 失败
*/
public static final int FAIL = 500;
private int code;
private String msg;
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, "操作成功");
}
public static <T> R<T> ok(String msg) {
return restResult(null, SUCCESS, msg);
}
public static <T> R<T> ok(String msg, T data) {
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail() {
return restResult(null, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg) {
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg, T data) {
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg) {
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg) {
R<T> r = new R<>();
r.setCode(code);
r.setData(data);
r.setMsg(msg);
return r;
}
public static <T> Boolean isError(R<T> ret) {
return !isSuccess(ret);
}
public static <T> Boolean isSuccess(R<T> ret) {
return R.SUCCESS == ret.getCode();
}
}
2、创建运行时异常类,当我们在程序中需要抛出异常提示时候,通过这个基础类将异常统一抛出
/**
* 运行时异常
*
*/
public class BaseException extends RuntimeException {
private static final long serialVersionUID = 1L;
public BaseException(String message) {
super(message);//调用父类传递异常消息
}
}
3、创建全局异常捕捉类,这里用到两个注解@RestControllerAdvice和@ExceptionHandler,@RestControllerAdvice 是 Spring Framework 提供的一个注解,用于定义全局的异常处理器以及跨切面的请求处理逻辑;@ExceptionHandler 是 Spring 框架中的一个注解,主要用于在控制器类中定义异常处理方法。当控制器中的方法抛出被 @ExceptionHandler 注解方法所声明的异常类型时,Spring 会调用该注解标记的方法来处理异常;他们两个配合使用时,当程序抛出异常会自动被捕捉到这里,我们在这里就可以统一处理程序的所有异常。
@RestControllerAdvice
public class GlobalExceptionHandler {
// 全局异常拦截
@ExceptionHandler
public R handlerException(Exception e) {
e.printStackTrace();
return R.fail(e.getMessage());
}
}
4、配置完毕后我们写一个接口来测试下
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/test")
public R test(Integer a){
if(a==1){
int i = 2 / 0;
} else if (a==2) {
throw new BaseException("参数错误");
}
return R.ok();
}
}
5、我们分别传入1和2来看返回信息,当出现分母为0异常时候自动捕捉并返回了异常信息提示,当我们自定义抛出异常时候同样也捕捉到返回了信息,到此结束。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f231d4439a9c4d2694d8c256fadf3c5f.png#pic_center
为了帮助更多像你一样的读者,我将持续在专栏中分享技术干货和实用技巧。如果你觉得这篇文章对你有帮助,可以考虑关注我的专栏,谢谢。