当前位置: 首页 > news >正文

Spring Boot 项目统一异常处理

在 Spring Boot 项目开发中,异常处理是一个非常重要的环节。良好的异常处理不仅能提高应用的健壮性,还能提升用户体验。本文将介绍如何在 Spring Boot 项目中实现统一异常处理。

统一异常处理有以下几个优点:

  1. 提高代码可维护性:异常处理逻辑集中管理,减少了代码的冗余和分散。
  2. 提升用户体验:用户能看到一致且友好的错误信息,而不是杂乱的堆栈跟踪。
  3. 安全性:避免将敏感的错误信息暴露给用户。

使用 @ControllerAdvice 和 @ExceptionHandler 实现统一异常处理

Spring 提供了 @ControllerAdvice 注解用于集中处理控制器层的全局异常。@ExceptionHandler 注解用于定义具体的异常处理方法。下面是一个基本的示例:

1. 创建异常处理类

首先,我们创建一些自定义异常处理类,以便可以捕捉到controller中出现的异常,防止直接报给前端500的错误码:

@ControllerAdvice //添加完此注解后,此类随着springboot项目的启动而启动,并且会监控controller的异常.监听项目中所有的异常
@ResponseBody
public class MyExceptionAdvice {//这里的一场都是意外异常,并不是业务异常,业务异常后端controller会处理返回给前端.业务异常会和前端沟通好已规定的状态码返回。@ExceptionHandler(NullPointerException.class)public HashMap<String,Object> doNullPointerException(NullPointerException e){HashMap<String, Object> res = new HashMap<>();res.put("code",-1);res.put("msg","空指针异常"+e.getMessage());res.put("data",null);return res;}// 默认的异常处理,当有有异常出现的时候,会先匹配子类的异常,当所有的异常都没有匹配的时候就会走这一条默认的一场路线业务。@ExceptionHandler(Exception.class)public HashMap<String,Object> doException(Exception e){HashMap<String, Object> res = new HashMap<>();res.put("code",-1);res.put("msg","异常"+e.getMessage());res.put("data",null);return res;}
}

 使用@ExceptionHandler 注解的时候,需要传入异常类。使用注解的方法名和返回值都可以自定义,但是传入的变量要和注解中传入的异常类保持一致。

我们也不可能将所有可能出现的异常都列举出来,那该怎么办呢?我们只需要针对所有异常类的父类Exception进行异常处理即可

 2. 触发异常观察结果

controller代码:

我们现在访问 http://127.0.0.1:8080/user/login :

 确实通过AOP的思想捕获到项目中出现的异常了,并且代码完全没有侵入到项目的业务代码中。

如果我们不进行这些异常处理会是怎么样的结果,我们注解去掉注解让异常处理失效,再次访问login,观察结果:

这样的结果并不是优秀的项目该有的,显得和挫啊。


总结

统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执⾏某个通知, 也就是执⾏某个⽅法事件。
http://www.lryc.cn/news/354335.html

相关文章:

  • 安卓手机APP开发__网络连接性支持VPN
  • Shopee单个商品详情采集
  • 深入研究Qt Meta - Object System
  • web学习笔记(五十八)
  • 精准安全运维,统信UOS服务器版V20(1070)漏洞修复指南丨年度更新
  • Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册
  • MySQL为什么会选错索引
  • kafka调优参考建议 —— 筑梦之路
  • Redis(十三) 事务
  • RK 11.0 多屏模式下修改鼠标进入方式
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • 浅析部署架构中的GZone、RZone和CZone
  • 【全开源】分类记账小程序系统源码(ThinkPHP+FastAdmin+UniApp)
  • Android NDK系列(四)NDK的编译
  • Jenkins--从入门到入土
  • 文心一言 VS 讯飞星火 VS chatgpt (267)-- 算法导论20.2 2题
  • C 语言设计模式(结构型)
  • 【云原生--K8S】K8S python接口研究
  • 5.26作业
  • 链接库文件体积优化工具篇:bloaty
  • 使用pyqt绘制一个爱心!
  • 关于 Transformer 的11个常见面试题
  • OS多核多线程锁记录笔记
  • nginx做TCP代理
  • python 异常处理 try
  • 月入10万+管道收益,揭秘旅游卡运营的5个阶段!
  • android_binder源码分析之_binder驱动使用服务
  • 【波点音乐看广告】
  • [SWPUCTF 2021 新生赛]pop
  • 【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目