浅谈Spring Boot 异常处理篇
发布时间 - 2026-01-11 03:00:25 点击率:次前言

先谈谈“异常处理”这件事。下面有 2 份伪代码,对比下:
// ① 基于 if/else 判断
if(deletePage(page) == E_OK){
if(registry.deleteReference(page.name) == E_OK){
if(configKeys.deleteKey(page.name.makeKey()) == E_OK){
logger.log("page deleted");
}else{
logger.log("configKey not deleted");
}
}else{
logger.log("deleteReference from registry failed");
}
}else{
logger.log("delete failed");
return E_RROR;
}
// ② 基于异常处理
try{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
logError(e);
}
可以看出,如果使用异常替代返回错误码,错误处理代码就能从主路径逻辑中分离出来,得到简化!
②中,基于异常处理的代码真的好吗?其实是丑陋不堪的,它搞乱了代码结构,把错误处理与正常流程混为一谈。最好把 try 和 catch 代码块的主体部分抽离出来,形成另外的函数。
// ③ 优雅的异常处理逻辑
public void delete(Page page){
try{
deletePageAndAllReferences(page);
}catch(Exception e){
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throw Exception{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e){
logger.log(e.getMessage());
}
③中,函数各司其职,更易于理解和修改了。
总结:使用异常而不是错误码,优雅地使用异常!函数应该只做一件事,处理错误就是一件事。因此,处理错误的函数不该做其他事!
在 Spring Boot 中处理异常
1、默认的异常处理
例如 401,404,500,5XX 等异常,Spring Boot 默认会跳转到预配置的页面,此处以 thymeleaf 模板引擎为例:
+ resources + templates + error - 401.html - 404.html - 500.html
只需在 resources/templates/error/ 路径下添加对应的html文件即可。
2、局部异常处理
局部异常一般处理业务逻辑出现的异常情况,在 Controller 下使用 @ExceptionHandler 注解来处理异常。举个小例子:
先定义 ResponseBean 和 ExceptionEnum 两个对象,辅助完成优雅的代码。
/**
* 统一响应
* @author anoy
*/
public class ResponseBean<T> {
private int code;
private String message;
private T data;
public ResponseBean(){}
public ResponseBean(ExceptionEnum exceptionEnum){
this.code = exceptionEnum.getCode();
this.message = exceptionEnum.getMessage();
}
// 省略 setter/getter
}
/**
* 异常类型枚举
* @author anoy
*/
public enum ExceptionEnum {
GIRL_FRIEND_NOT_FOUND(100000, "girl friend not found");
private int code;
private String message;
ExceptionEnum(int code, String message){
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
今天七夕,写个 GirlFriendNotFoundException(很有同感,是不是?)
@Controller
public class UserController {
@RequestMapping("/friend/{id}")
public String friend(@PathVariable("id") Long id) throws GirlFriendNotFoundException {
if (id == 1L){
throw new GirlFriendNotFoundException();
}
return "friend";
}
@ExceptionHandler(GirlFriendNotFoundException.class)
@ResponseBody
public ResponseBean handleGirlFriendNotFound(GirlFriendNotFoundException exception){
loggerError(exception);
return new ResponseBean(ExceptionEnum.GIRL_FRIEND_NOT_FOUND);
}
private void logError(Exception e){
logger.error(e.getMessage());
}
}
3、全局异常处理
个人观点:全局异常应该处理系统故障级别的问题,像参数校验这种类型的异常,应该作为局部异常来处理,例如 Redis 连接断开,无法请求数据,这种异常就应该当做全局异常来处理,在异常处理的逻辑中,还应该添加通知到开发人员的功能,方便开发人员及时处理错误!
全局异常处理,使用 @ControllerAdvice 和 @ExceptionHandler 来配合。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RedisConnectionFailureException.class)
public void handlerRedisConnectionFailureException(RedisConnectionFailureException exception){
logError(exception);
noticeToDev();
}
private void logError(Exception e){
logger.error(e.getMessage());
}
private void noticeToDev(){
// 通知具体开发人员
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Spring
# Boot
# 异常处理
# Spring Boot统一异常处理详解
# SpringBoot初始教程之统一异常处理详解
# 详解Springboot自定义异常处理
# Spring Boot全局异常处理解析
# springboot全局异常处理详解
# SpringBoot如何优雅的处理全局异常
# Spring boot项目中异常拦截设计和处理详解
# Spring Boot详细打印启动时异常堆栈信息详析
# 开发人员
# 一件事
# 就能
# 各司其职
# 很有
# 只需
# 错误码
# 这件事
# 个人观点
# 为例
# 可以看出
# 只做
# 该做
# 大家多多
# 举个
# 跳转到
# 而不是
# java
# deletePage
# class
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在局域网内绑定自建网站域名?
b2c电商网站制作流程,b2c水平综合的电商平台?
三星网站视频制作教程下载,三星w23网页如何全屏?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Python进程池调度策略_任务分发说明【指导】
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
怎样使用JSON进行数据交换_它有什么限制
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
iOS UIView常见属性方法小结
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
如何在VPS电脑上快速搭建网站?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何在企业微信快速生成手机电脑官网?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何正确下载安装西数主机建站助手?
Laravel怎么使用artisan命令缓存配置和视图
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Bootstrap CSS布局之列表
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Internet Explorer官网直接进入 IE浏览器在线体验版网址
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何使用Service Container和依赖注入?(代码示例)
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel怎么使用Intervention Image库处理图片上传和缩放
千库网官网入口推荐 千库网设计创意平台入口
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
javascript基于原型链的继承及call和apply函数用法分析
网页设计与网站制作内容,怎样注册网站?

