Spring Boot 异常处理

Spring Boot默认异常处理 在日常的 Web 开发中,会经常遇到大大小小的异常,此时往往需要一个统一的异常处理机制,来保证客户端能接收较为友好的提示。Spring Boot 同样提供了一套默认的异常处理机制,本节将对它进行详细的介绍。Spring Boot 默认异常处理机制 Spring Boot 提供了一套默认的异常处理机制,一旦程序中出现了异常,Spring Boot 会自动识别客户端的类型(浏览器客户端或机器客户端),并根据客户端的不同,以不同的形式展示异常信息。图1:Spring Boot 默认错误白页下面,我们依次对这四个组 阅读详情

img

前言

先谈谈“异常处理”这件事。下面有 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(){
        // 通知具体开发人员
    }

}

常见问题

1、局部异常和全局异常处理同一种类型的 Exception,会发生什么结果?答:只会执行局部异常的处理逻辑!

2、GirlFriendNotFoundException 继承了 RuntimeException, 使用@ExceptionHandler(RuntimeException.class) 能处理异常吗?答:可以的!所以对于局部比较公用的异常可以定义一个父类,抛出异常时可以抛出具体的子类异常,处理时,处理父类异常即可(即只用写一个方法处理一系列类似的异常)

© 著作权归作者所有,转载或内容合作请联系作者

img

● 拒绝黑盒应用-Spring Boot 应用可视化监控

● 并发Bug之源有三,请睁大眼睛看清它们

● 史上最轻松入门之Spring Batch - 轻量级批处理框架实践

● Spring Cloud Gateway - 快速开始

● APM工具寻找了一圈,发现SkyWalking才是我的真爱

● Spring Boot 注入外部配置到应用内部的静态变量

● 将 HTML 转化为 PDF新姿势

● Java 使用 UnixSocket 调用 Docker API

● Fastjson致命缺陷

● Service Mesh - gRPC 本地联调远程服务

● 使用 Thymeleaf 动态渲染 HTML

原文链接:

本文由博客一文多发平台 OpenWrite 发布!

详解Spring Boot默认异常处理 在日常的 Web 开发中,会经常遇到大大小小的异常,此时往往需要一个统一的异常处理机制,来保证客户端能接收较为友好的提示。Spring Boot 同样提供了一套默认的异常处理机制,本节将对它进行详细的介绍。 Spring Boot 默认异常处理机制 Spring Boot 提供了一套默认的异常处理机制,一旦程序中出现了异常,Spring Boot 会自动识别客户端的类型(浏览器客户端或机器客户端),并根据客户端的不同,以不同的形式展示异常信息。 对于浏览器客户端而言,Spring Boot 会响应一个 阅读详情

相关推荐

Spring Boot整合thymeleaf并进行异常处理

我们先故意写一个异常的控制器类,然后写一个有异常产生的方法,然后通过一个url访问。 我们可以看到项目运行时出现异常,页面会跳转到如下图所示的Whitelable Error Page页面: 但是,现在我想根据异常类型跳转到我自定义的异常页面,我们该怎么弄呢?这就是我接下来要写的内容。 一.首先我们先了解一下异常处理的思路 1.自定义异常类继承运行时异常 2.新建异常处理类,使用@Contro...

阳光慵懒的博客 1812

社区头条:Spring For All 新版上线了!!!

走过路过,别错过 Spring For All Spring For All 社区 2.0 01 Spring For All 社区是什么 Spring For All 垂直技术社区(spring4all.com),国内首个 Spring 及 Spring Cloud 构建微服务架构的交流社区。更好地为大家提供 Spring 技术内容分享,大家可以到这里获得更多关于 Sprin

程序猿DD 1581

spring boot中统一异常处理

在前面的博客中,Spring Boot整合jpa,Shiro进行权限管理 异常都是直接返回到页面上,这样做既不安全,也不友好,所以在返回给页面之前,我们需要对异常信息进行统一的处理,该部分的处理思路和spring mvc的处理思路是一致的。 下面,我们来对前面的示例进行改造,从而能够支持统一的异常处理。 1、定义全局异常处理类 @ControllerAdvice public class

牛奋lch 5205

SpringCloud中文社区转型Spring4All欢迎您的加入

相信关注我们Spring Cloud中文社区(bbs.springcloud.com.cn)的朋友们最近已经在最新的横幅中发现了一个全新的社区:spring4all.com,相信从名字大家也能猜到该域名寓意Spring For All,那么我们为什么要重新创建这样一个社区呢? 关于Spring For All 截止至今天,我们的论...

weixin_34112030的博客 221

Spring Boot:异常处理

Spring Boot异常处理介绍

啊Q老师 6849

【excel+vba】一表拆多表+不同收件人附带不同附件

快捷处理:拆分多个不同表 给不同人发送不同内容且附带附件

weixin_42779327的博客 2968

springboot使用skywalking

skywalking安装参照本篇文章 https://blog.youkuaiyun.com/kq1983/article/details/108146268 复制agent文件 从skywalking的agent目录,复制到本地某个目录 本地项目打成jar包 比如springmvc-1.0-SNAPSHOT.jar 启动脚本 java -javaagent:D:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.ser...

kongkong的专栏 1149

ADS中HB仿真自动优化报错问题解决心得

在ADS HB仿真中自动优化出现报错被强制暂停,解决方法如下

yyyyyyyyyyjy的博客 6544

Spring For All 社区 微服务 MSA 系列教程

转载自:http://www.spring4all.com/article/609

Ryze 272

voc与txt互转

voc2txt # coding:utf-8 from __future__ import print_function import os import random import glob import xml.etree.ElementTree as ET def xml_reader(filename): """ Parse a PASCAL VOC xml file """ tree = ET.parse(filename) size = tree.find('siz

weixin_44898889的博客 826

基于立创EDA的IP5389BZ+IP6829 100W有线15W无线带屏充电宝DIY全流程解析

本文详细解析了基于立创EDA平台,采用IP5389BZ和IP6829芯片DIY一款100W有线快充、15W无线充电并带显示屏的移动电源的全过程。内容涵盖核心功能规划、硬件选型、电路设计、PCB布局、焊接组装、分步调试以及软件逻辑,为电子爱好者提供了一份从原理到实践的完整指南,并重点强调了电池安全与IP6829供电电压等关键注意事项。

weixin_34374684的博客 308

SpringBoot实战(十六):集成Skywalking调用链监控系统

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 【前言】 Skywalking做为生产级的调用链监控工具,不仅提供了丰富的监控系统,而且通过字节码拦截形式集成系统,对系统没有任何侵入性;最近研究一下调用链项目,在此与大家共享; 【集成调用链】 一、Skywalking的github项目地址: ...

通往精英的成长之路 2万+

ubuntu安装XXX包时出现(= 20.0.8-0ubuntu1~18.04.1) but it is not going to be installed

安装mujoco_py时,最后一步尝试 import mujoco_py 时出现报错 esashim.c:1:10: fatal error: GL/osmesa.h: No such file or directory 1 | #include <GL/osmesa.h> | ^~~~~~~~~~~~~ compilation terminated. 在https://github.com/openai/mujoco-py#ubuntu-ins

dealexce的博客 1794

Spring Boot2统一异常处理

Spring Boot 2.0 统一异常处理为什么要统一异常处理项目框架及异常类型项目代码pom依赖(只写出该模块涉及依赖)配置yml(properties基本一样)通用返回类统一异常处理类实现ErrorController接口 为什么要统一异常处理 项目开发形式为前后端分离,采用Restful接口形式开发,对异常的处理与页面业务数据统一以json形式返回,登录等接口由前端路由实现。 项目框架及异...

canfengli的博客 8920

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 275

Windows 11 - 打开操作安全中心提示 “需要使用新应用以打开此 Windowsdefender 链接“ 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开)

Windows 11 - 打开操作安全中心提示 "需要使用新应用以打开此 Windowsdefender 链接" 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开),当您点击任务栏上要关闭安全中心防护设置时,这种情况打不开怎么解决,怎么办,Windows安全中心,病毒和威胁保护,账户保护,防火墙和网络保护,设备安全性。

🏆 前端领域优质创作者 1万+

在 Spring Boot 中实现异常处理的全面指南

Spring Boot 通过和提供强大的异常处理机制,支持统一 REST 和页面错误响应。示例展示了全局异常处理、自定义异常及与分页、Swagger、ActiveMQ、Profiles、Security、Batch、FreeMarker 的集成。性能测试表明异常处理开销低(5ms)。针对你的查询(ThreadLocal、Actuator、热加载),通过清理、Security 和 DevTools 解决。未来趋势包括增强 ProblemDetail 和 AI 辅助。

lssffy的博客 2002

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot教程之二十四:Spring Boot 中的异常处理

在以前的方法中,注释的方法只能处理该特定类抛出的异常。但是,如果我们想处理整个应用程序抛出的任何异常,我们可以定义一个全局异常处理程序类并用 注释它。有助于处理 API 中存在的错误和异常,从而提供强大的企业应用程序。当用户尝试更新数据库中不存在的客户的详细信息时,此方法将引发 NoSuchCustomerExistsException 异常。如果用户尝试更新数据库中尚不存在的客户详细信息,则中定义的方法将抛出。Spring Boot 提供了多种处理异常的方法,确保您的应用程序能够返回有意义的错误。

潜洋的专栏 1489

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring Boot异常处理全面指南

ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "资源不存在")分层处理:根据不同层级和场景选择合适的处理方式统一响应:确保所有异常返回格式一致安全考量:生产环境避免泄露敏感信息监控完备:结合日志和监控系统,便于问题排查推荐使用组合作为主要的异常处理方案,它在灵活性和易用性之间取得了良好平衡。这份文档全面涵盖了Spring Boot异常处理的各个方面,从基础概念到高级实践都提供了详细的代码示例和最佳实践建议。

倚肆的博客 801

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

spring-boot 异常处理机制

spring-boot的异常处理机制       掌握一些注解的使用 1.首先spring-boot后台遇到异常的时候,会被捕获,默认情况下跳转到全局的error页面。也就是src/main/resource/templates/error.html 当这个页面没有就会报错。 框架会将错误信息输出到显示层   key是exception 但是我们的项目可能有多种异常的处理,也就是...

文嘉 320

spring-boot异常处理

Emm昨天台风停电就没写博客 Spring-boot异常处理 如果你在src/main/resource/templates目录下新建了error.html。那么当服务器出现异常的时候都会跳转到error.html。但是这样的方法,不适合我们开发 讲下另外一种方法 1.配置依pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

qq_42011565的博客 185

深入 Spring Boot 异常处理底层机制

Spring Boot 异常处理机制解析 Spring Boot 异常处理遵循"异常捕获-规则匹配-响应生成"流程,涉及多个核心组件协同工作。DispatcherServlet捕获异常后,ExceptionHandlerExceptionResolver优先匹配局部@ExceptionHandler方法,未匹配时查找@ControllerAdvice全局处理器,最终由BasicErrorController兜底处理。关键组件包括负责错误页注册的ErrorPageRegistrar和收集错

weixin_44289947的博客 1434

Spring Boot统一异常处理

本文介绍了SpringBoot中实现统一异常处理的方法。通过@ControllerAdvice和@ExceptionHandler注解组合,可以集中处理控制器层异常,避免重复代码。主要包括:1)创建全局异常处理类;2)定义统一错误响应结构;3)处理特定异常类型;4)创建自定义异常类;5)支持多种响应格式;6)集成日志记录;7)编写测试用例验证。该方法使业务代码更简洁,提供标准化错误响应,并可根据需求扩展多语言支持等功能。

J_liaty的博客 726

Spring Boot中通用异常处理

Spring Boot中通用异常处理 一、引入 在前后台交互数据过程中会因为数据不当根具具体情况给页面返回相对友好的信息。 二、流程 实体类 @Data public class Item { private Integer id; private String name; private Long price; } 自定义异常处理 /** * 继承java的RuntimeException异常 */ @NoArgsConstructor @AllArgsCons

h15835161250的博客 256
上一篇: 拒绝黑盒应用-Spring Boot 应用可视化监控
下一篇: Spring Boot 配置 - 配置信息加密
SpringForAll
博客等级 码龄7年 15粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值