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,不一定都是未登录导致的。
如果对上游的错误码非常熟悉,应该做更细致的判断处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗