【Java】Springboot中设计全局异常处理,统一消息体封装

前言

  在项目架构搭建中我们一般要进行统一异常处理,这样就不需要我们在程序中到处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
在这里插入图片描述
在这里插入图片描述

为了帮助更多像你一样的读者,我将持续在专栏中分享技术干货和实用技巧。如果你觉得这篇文章对你有帮助,可以考虑关注我的专栏,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值