SpringBoot统一异常处理方法

      在工作过程中,如果项目架构没有做到位,对于异常没有特殊的处理,通常会将代码执行过程中遇到Exception会直接以栈信息的形式返回给前端。其中这样的形式不美观,并且也非常危险(比如:插入表错误,会返给前端关于表名称和表字段信息)。针对这种情况,其实无论springmvc还是springboot都有统一的注解进行统一的封装处理返给前端。下面我大概介绍一下我们项目都是怎么统一封装处理的。

     1、因为我们项目都是前后端分离的项目于,所以后端服务通常都是以接口的形式展示给前端。所以我们通常我们会封装统一的返回成功或者失败的信息。

public class RestResponse<T> {

    private String code;
    private boolean success = false;
    private String msg;
    private T data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static RestResponse success(Object data) {
        return create("0", "成功", true, data);
    }

    public static RestResponse fail(String code, String msg) {
        return create(code, msg, false, null);
    }

    public static RestResponse create(String code, String msg, boolean success, Object data) {
        RestResponse resp = new RestResponse();
        resp.setCode(code);
        resp.setMsg(msg);
        resp.setSuccess(success);
        resp.setData(data);
        return resp;
    }
}

2、我们会自定义一些业务异常,返给前端,以便前端展示对应的错误,让用户明白操作哪里有问题。但是有时候也有有非业务异常,这样通常会统一封装,返回前端错误信息“系统异常,请联系管理员”的错误信息。

public class BusinessException extends RuntimeException{

    private  String code;
    private  String message;

    public BusinessException() {
    }

    public BusinessException(String message, String errCode) {
        super((String)null);
        this.code = errCode;
        this.message = message;
    }

    public BusinessException(String message, Throwable cause) {
        super((String)null, cause);
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

3、全局拦截器返回的错误信息,根据不同的异常类型调用对应的方法。

public class GlobalExceptionHandle {
    /**
     * 统一处理业务异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public <T> RestResponse<T> doBusException(BusinessException e) {
        //1、记录错误日志
        //2、返回结果
        return RestResponse.fail(e.getCode(), e.getMessage());
    }

    /**
     * 处理其他异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler
    public <T> RestResponse<T> doException(Exception e) {
        //1、记录错误日志
        //2、返回结果
        return RestResponse.fail("500","系统异常,请联系管理员");
    }

}

4、最后这是我们的实现一个接口调用,返回业务报错验证这个这个结果。

@RestController
@RequestMapping("")
public class LoginController {

    /**
     * 检验登录用户是否正确
     *
     * @param name  用户名
     * @param password  密码
     * @return
     */
    @RequestMapping("/login")
    public RestResponse<String> checkLogin(@RequestParam("name") String name, @RequestParam("password") String password) {
        if (!(Objects.equals(name, "hxx") && Objects.equals(password, "123456"))) {
            throw new BusinessException("1000", "登录信息有误!");
        }
        return RestResponse.success(true);
    }

}

  最后我们可以看到结果信息

5、验证非业务异常信息

@RestController
@RequestMapping("")
public class LoginController {

    /**
     * 检验登录用户是否正确
     *
     * @param name  用户名
     * @param password  密码
     * @return
     */
    @RequestMapping("/login")
    public RestResponse<String> checkLogin(@RequestParam("name") String name, @RequestParam("password") String password) {
        int result = 1 / 0;
        return RestResponse.success(true);
    }

}

最后我们可以看到结果信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值