SpringBoot统一异常处理方法

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

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

public class RestResponse {

    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 
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public  RestResponse doBusException(BusinessException e) {
        //1、记录错误日志
        //2、返回结果
        return RestResponse.fail(e.getCode(), e.getMessage());
    }

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

}

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

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

    /**
     * 检验登录用户是否正确
     *
     * @param name  用户名
     * @param password  密码
     * @return
     */
    @RequestMapping("/login")
    public RestResponse 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);
    }

}

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

SpringBoot统一异常处理方法_第1张图片

5、验证非业务异常信息

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

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

}

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

SpringBoot统一异常处理方法_第2张图片

你可能感兴趣的:(java,开发语言)