有时候在项目中我们需要调用别人的接口,当上游接口挂掉或者其他异常的时候,我们希望展示具体的异常信息,而不是返回空指针异常。
这个时候就对上游接口的异常信息十分了解,有针对性的做相应处理。
以未登录异常为例,我的上游需要我登陆才能访问,那么我先定义一个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,不一定都是未登录导致的。
如果对上游的错误码非常熟悉,应该做更细致的判断处理。