三种方式处理SpringBoot全局异常

news/2025/9/19 22:33:43/文章来源:https://www.cnblogs.com/2678066103hs/p/19101808

在SpringBoot开发web项目时,异常处理是必不可少的一部分。在应用中,异常可能出现在任何地方,例如在控制层,服务层,数据访问层等等。如果不对异常进行处理可能会导致应用崩溃或者出现未知的错误。因此对于异常的处理是非常重要的。

什么是SpringBoot应用异常处理?

Spring Boot应用异常处理是指在Spring Boot应用中对异常进行捕获和处理的机制。当应用发生异常时,可以通过异常处理机制来捕获异常并进行相应的处理,例如返回友好的错误信息给用户,记录异常日志等。

Spring Boot应用异常处理的实现原理?

Spring Boot应用异常处理的实现原理主要依赖于Spring框架提供的异常处理机制。在Spring Boot应用中,可以通过自定义异常处理器来捕获和处理异常。

具体实现步骤如下:

  • 创建一个自定义的异常类,继承自Exception或RuntimeException,用于表示应用中的特定异常情况。
  • 创建一个全局异常处理器,使用@ControllerAdvice注解标记,并在类中定义异常处理方法,使用@ExceptionHandler注解标记该方法可以处理的异常类型。
  • 在异常处理方法中,可以根据具体的异常类型进行相应的处理,例如返回友好的错误信息给用户、记录异常日志等。
  • 在Spring Boot应用中,可以通过配置文件或者注解的方式将自定义的异常处理器注册到应用中。

Spring Boot应用异常处理的优点

  • 统一异常处理:通过自定义异常处理器,可以统一处理应用中的异常,提供统一的错误信息给用户,提高用户体验。
  • 异常日志记录:可以在异常处理器中记录异常日志,方便开发人员定位和解决问题。
  • 可扩展性:可以根据具体的业务需求,自定义异常处理器,实现特定的异常处理逻辑。

Spring Boot应用异常处理的缺点

  • 异常处理逻辑可能会增加代码复杂性,需要谨慎设计和实现。
  • 如果异常处理不当,可能会导致应用出现安全漏洞或者信息泄露的风险。

三种处理方式

使用@ControllerAdvice注解

@ControllerAdvice 是 SpringBoot 提供的一个注解,用于定义全局异常处理器。在使用@ControllerAdvice 注解时,需要使用@ExceptionHandler 注解来指定处理的异常类型。

@ControllerAdvice // 定义一个全局异常处理器
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class) //指定了需要处理的异常类型为Exception 当应用中出现Exception类型的异常时,就会调用handleException方法来处理异常public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());}
}

使用@ExceptionHandler 注解

还可以在控制器中使用@ExceptionHandler 注解来处理异常。这种方式的好处是可以针对不同的控制器方法定义不同的异常处理器。

@RestController
public class UserController {@Autowiredprivate UserService userService;@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());}@GetMapping("/users/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.getUserById(id);if (user == null) {throw new UserNotFoundException("User not found");}return ResponseEntity.ok(user);}
}

在上面的例子中,在控制器中定义了一个 handleUserNotFoundException 方法,用于处理 UserNotFoundException 类型的异常。当 getUser 方法中出现 UserNotFoundException 类型的异常时,就会调用 handleUserNotFoundException 方法来处理异常。

使用 HandlerExceptionResolver 接口

除了使用@ControllerAdvice 注解和@ExceptionHandler 注解外,还可以实现 HandlerExceptionResolver 接口来处理异常。这种方式比较灵活,可以自定义异常处理器的实现方式。

public class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {ModelAndView mav = new ModelAndView();mav.addObject("exception", ex);mav.setViewName("error");return mav;}
}

在上面的例子中,我们实现了 HandlerExceptionResolver 接口,并重写了 resolveException 方法来处理异常。当应用中出现异常时,就会调用 resolveException 方法来处理异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解题记录说是 | P3695 CYaRon!语

小模拟link 起因 闲的没事找模拟做,发现这个部分分的档次很多,而且好想挺好做,就做了。 是分着部分分做的,而且完全就是那种苦(封装各种实现)尽甘(飞速写完 ihu hor while)来的感觉,很爽的。 code goes first…

分享一个极度精简的绿色的 五笔输入法

这个输入法是本人修改过的 柚子输入法,极度精简,绿色无需安装,释放之后即可使用. 功能说明请看 压缩包的说明文件. 通过网盘分享的文件:youziIME2025-9-19.rar 链接: 百度网盘 如果需要修改功能,你需要懂一点Auto…

[GDKOI2023 提高组] 游戏 题解

一种比较简短的写法: 拉出直径,再在直径的每一个点上跑一下最长链,为 $ mx_i$ 这里设三点的路径交点为 \(rt\)。 假设 \(rt \rightarrow u,v,w\) 的距离为 \(dis1,dis2,dis3\) 。 容易知道 \(dis1 = (x+y-z)/2,dis2…

CSP-J/S 2025 游记

突然发现今年忘记写游记了…… [2025.6.30,2025.8.1) 中考。 [2025.8.1,2025.8.31] 暑假集训 15 天,一天比赛一天专题。早上 8:00 到机房训到 12:00 然后和高三抢饭,下午 14:00-17:00 继续搞,晚上 19:00-22:00。只有…

2025.9.19 计数dp小记

[CQOI2011] 放棋子 本题有一个性质,棋子间互不关联,又因为数据范围小,很容易 \(dp\) 记 \(f_{p,i,j}\) 表示考虑前 \(p\) 种颜色,放了 \(i\) 行 \(j\) 列的方案数 则枚举 \(p\) 放了几行几列,有 \[f_{p,i,j} = \s…

实用指南:AI推理范式:从CoT到ReAct再到ToT的进化之路

实用指南:AI推理范式:从CoT到ReAct再到ToT的进化之路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

sign up - Gon

如果注册github时出现 Unable to verify your captcha response. Please visit https://docs.github.com/articles/troubleshooting-connectivity-problems/#troubleshooting-the-captcha for troubleshooting informa…

ctfshow web入门 信息搜集

有些题目会了就没写了,只记录一下自己不会写的题目,不过信息搜集还是很重要的ctfshow web3(自带网络工具包查看数据)查看源码什么也没有扫目录也什么都没有只能说信息收集能力还欠佳, 我们可以先尝试使用浏览器自带…

完整教程:数据结构:单链表的应用(力扣算法题)第二章

完整教程:数据结构:单链表的应用(力扣算法题)第二章pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

CF2039E Shohag Loves Inversions

CF2039E Shohag Loves Inversions 题意: 给你一个数列,初始数列为 $ a = [0, 1] $ ,现在重复进行以下操作若干次:将当前数组中逆序对个数 \(k\) 插入当前数组中任意一个位置,包括开头或者结尾。其中 \(n\le 1e6\)…

深入解析:sqlite3的加解密全过程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

U522155 板垣 カノエ is WATCHING YOU std

U522155 板垣 カノエ is WATCHING YOU #include<bits/stdc++.h> #define int long long #define add(a,b) to[++ tot] = b,nxt[tot] = h[a],h[a] = tot #define con putchar_unlocked( ) #define ent putchar_u…

ctfshow web

ctfshow里面免费的web题不写白不写ctf.show_红包题第二弹1打开题目显示这样 看看源码有无提示可以看到提示了cmd参数,那我们就随便传点东西看看会有什么回显又是代码审计,可以看到大小写字母过滤后只有小写p可以使用…

代码随想录算法训练营第三天 | leetcode 203 707 206

203移除链表元素 注意事项:java语言的访问链表和数据用的是".",空指针是小写的null。在删除链表时先对表头进行判断避免表头是null和表头元素是要删除的元素,下面进行循环寻找时要注意判断指针的下一个指针…

Codeforces Round 1051 (Div. 2) A~D2

A. All Lengths Subtraction 思维。 每次选择长度为 \(k(k \in [1,n])\) 的区间减 \(1\),那么第一个首选的就是 \(a_i = n\) 的 位置,然后维护 \(n\) 所在的区间,检查 \(n-k+1\) 是否在其两边,有的话就扩大区间,否…

【F#学习】数组:Array

Array 在F#中, 一个数组(Array)包含0个或多个元素,长度固定,但内容可以改变。元素需要具有相同的类型。 // 声明一个数组。注意看清操作符是 [| 和 |] let empty = [| |] let emptyAlternative = Array.emptylet …

CTFWEB姿势总结

CTFWEB姿势总结 RCE 尝试是否有命令执行漏洞 示例 payload 思路(Linux 为例):简单命令report; whoami report|whoami report$(whoami)如果 URL 执行后页面输出了你的用户名(例如 www-data),说明命令执行存在。 W…

详细介绍:架构思维:分布式缓存实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

规模化加速AI:从用户、开发者到企业的深度策略解析

本文深入探讨了加速AI系统的三大维度:终端用户追求的实时响应体验、开发者面临的数据与硬件瓶颈解决方案,以及企业关注的投产效率与合规性。文章详细分析了边缘推理、模型压缩、多云GPU调度等关键技术策略,并引用行…

ctfshow 菜狗杯

没想到在菜狗杯写到了qq列表里的佬出的题ctfshow 小舔田? <?php include "flag.php"; highlight_file(__FILE__);class Moon{public $name="月亮";public function __toString(){return $thi…