springboot统一处理异常(二)

有时候在项目中我们需要调用别人的接口,当上游接口挂掉或者其他异常的时候,我们希望展示具体的异常信息,而不是返回空指针异常。

这个时候就对上游接口的异常信息十分了解,有针对性的做相应处理。

以未登录异常为例,我的上游需要我登陆才能访问,那么我先定义一个LoginException.

之所以继承RuntimeException是因为,出现这样的异常我们无法处理。所以就不需要try catch了。

一、定义异常

public class LoginException extends RuntimeException {
    private static final long serialVersionUID = -6479038174003545730L;

    public LoginException() {
        super();
    }

    public LoginException(String message) {
        super(message);
    }


}

二、抛出异常

然后我们在可能出现异常的地方,抛出这种异常,显然只在调用别人特定接口的时候需要做这种处理

public JSONObject checkLogin(String url, Headers headers, RequestBody body) {
        Response response = postData(url, headers, body);
        String string = null;
        try {
            string = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject jsonObject = JSONObject.parseObject(string);
        JSONObject result = jsonObject.getJSONObject("result");
        if (result == null) {
            throw new LoginException(jsonObject.toJSONString());
        }
        return result;
    }

三、统一处理异常

我们在Controller中定义了全局的处理异常类,只需要增加捕获LoginException的方法即可

@ControllerAdvice
@ResponseBody
public class GlobalException {
 ...

@ExceptionHandler(value = LoginException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public BaseResponse loginException(Exception e) {
        e.printStackTrace();
        return BaseResultUtils.error(ERROR6);
    }

...

}

四、效果展示

当我们不登录就访问上游接口的时候,再也不是返回空指针异常了

 最后补充:

其实上面的处理逻辑有些武断,因为result等于null,不一定都是未登录导致的。

如果对上游的错误码非常熟悉,应该做更细致的判断处理。

原文地址:https://www.cnblogs.com/wangbin2188/p/15066556.html