spring的异常统一处理

news2026/4/2 7:16:44

前情回顾:

        首先明确,当你的代码遇到bug时会报错,那报错后不处理就会程序停止运行。

那就需要异常捕获了,两种方法:

        一、try...catch...直接自己处理

        二、throws 将异常抛给调用者

        在spring的框架中,要求就是简洁,在大量的代码中有try..catch会导致很臃肿。所以大部分会采取抛异常的方法。但controller就是最高级别的调用了,由于 Controller 层为处于请求处理的最顶层,再往上就是框架代码的。所以需要在这一层处理异常。


       当然你不处理,tomcat也不会停机,至于为什么,如下:

        Tomcat默认异常处理: Tomcat有一个默认的异常处理机制,可以捕获未捕获的异常,输出异常信息到控制台,并继续运行。这是为了防止一个异常导致整个Tomcat服务器崩溃。如果你希望在发生异常时停止Tomcat,可以配置Tomcat的catalina.shcatalina.bat文件,在启动脚本中加入-Dorg.apache.catalina.STOP.ON_FAIL=true参数。


 

由此,引出spring的异常统一处理:

        一、在controller内中局部处理异常

        这个只会处理当前controller的异常

@Slf4j
@Controller
@RequestMapping("/class")
@ResponseBody
public class ClassController {

    @Autowired
    IClassService classService;

    @ExceptionHandler
    @ResponseBody
    public Result exceptionHandler(Exception e) {
            log.error("[{}] system error", e);
            return Result.fail("错误信息"+e.getCause().getMessage());
    }

}
  1. 所有 Controller 方法(即被 RequestMapping 注解的方法)抛出的异常,会被该异常处理方法处理。

  2. 使用上,在 Controller 内部,用@ExceptionHandler注解的方法,就会作为该 Controller 内部的异常处理方法。

  3. 并且,它的参数中可以注入如 WebRequest、NativeWebRequest 等,用来拿到请求相关的数据。

  4. 它可以返回 String 代表一个 视图 view 名称,也可以返回一个对象并且用@ResponseBody修饰,由框架的其它机制帮你序列化。

此外,它还能够对异常类型进行细粒度的控制,通过注解可以有选择的指定异常处理方法应用的异常类型:

@ExceptionHandler({BusinessException.class, DataBaseError.class })

虽然说全局异常处理 HandlerExceptionResolver 通过条件判断也能做到,但是使用这种注解方式明显更具有可读性。


        二、在在全局的异常统一处理

第一种方法用在局部有效,但全局的处理却比较繁琐,那看下面的方法

首先,定义一个存放异常处理函数的类,并使用@ControllerAdvice修饰。

@Slf4j
@RestControllerAdvice(value = "com.aqiuo.controller")
public class HandlerError {
    @ExceptionHandler
    public Result exceptionHandler(Exception e) {
        log.error("[{}] system error", e);
        return Result.fail("错误信息"+e.getCause().getMessage());
    }

}

注意到,我是这样编写注解的:

@ControllerAdvice(value = "com.aqiuo.controller")

它用来限定这些异常处理函数起作用的 Controller 的范围。如果不写,则默认对所有 Controller 有效。

这也是 ControllerAdvice 进行统一异常处理的优点,它能够细粒度的控制该异常处理器针对哪些 Controller 有效,这样的好处是:

  1. 一个系统里就能够存在不同的异常处理器,Controller 也可以有选择的决定使用哪个,更加灵活。

  2. 不同的业务模块可能对异常处理的方式不同,通过该机制就能做到。

  3. 设想一个一开始并未使用全局异常处理的系统,如果直接引入全局范围内生效的全局异常处理,势必可能会改变已有 Controller 的行为,有侵入性。也就是说,如果不控制生效范围,即默认对所有 Controller 生效。如果控制生效范围,则默认对所有 Controller 不生效,降低侵入性。

ControllerAdvice 支持的限定范围:
  1. 按注解:@ControllerAdvice(annotations = RestController.class)

  2. 按包名:@ControllerAdvice("org.example.controllers")

  3. 按类型:@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})

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

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

相关文章

磁盘管理与文件系统

文章目录 磁盘管理与文件系统一、磁盘基础1、磁盘结构12、磁盘结构2 二、磁盘分区表示1、主引导记录(MBR:Mast Boot Record)2、磁盘分区表示3、文件系统类型 三、管理磁盘及分区1、检测并确认新硬盘fdisk命令①、查看或管理磁盘分区②、查看常…

如何开发员工管理软件app系统?

我们都知道,不同的业务有多种软件app小程序。但移动软件app小程序不仅可以为企业带来利润,也可以为工作场所的员工带来利润。 您知道小型企业和大型企业都可以从使用的移动软件app小程序中受益。这就是为什么按需软件app小程序开发的需求变得很高的原因…

工具系列:TimeGPT_(6)同时预测多个时间序列

TimeGPT提供了一个强大的多系列预测解决方案,它涉及同时分析多个数据系列,而不是单个系列。该工具可以使用广泛的系列进行微调,使您能够根据自己的特定需求或任务来定制模型。 # Import the colab_badge module from the nixtlats.utils pac…

内网穿透的应用-开源表格工具APITable本地部署结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台,是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

Windows 平台下安装与配置 MySQL 5.7.36

接上文, 配置 MySQL 服务 MySQL 安装完毕之后,需要对服务器进行配置。具体的配置步骤如下。 STEP 01: 在“MySQL安装完成窗口” 单击【Next】(下一步)按钮,进入服务器配置窗口,如图8所示。选择产…

2024年软考有电子证书吗?如何下载?

并非所有地区都设有软考电子证书制度,目前只有广东、浙江和山东实行了软考电子证书。至于打印时间,由于各地区规定不同,一般在合格标准公布后约一个月左右进行打印。 广东软考电子证书 盖有”广东省人力资源和社会保障厅专业技术人员资格考试…

什么是负载均衡?

负载均衡是指在计算机网络领域中,将客户端请求分配到多台服务器上以实现带宽资源共享、优化资源利用率和提高系统性能的技术。负载均衡可以帮助小云有效解决单个服务器容量不足或性能瓶颈的问题,小云通过平衡流量负载,使得多台服务器能够共同…

1. Spring概述

概述 Spring 是一个开源框架Spring 为简化企业级开发而生,使用 Spring,JavaBean 就可以实现很多以前要靠 EJB 才能实现的功能。同样的功能,在 EJB 中要通过繁琐的配置和复杂的代码才能够实现,而在 Spring 中却非常的优雅和简洁。…

53.网游逆向分析与插件开发-游戏反调试功能的实现-通过内核信息检测调试器

码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:b44fddef016fc1587eda40ca7f112f02a8289504 代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-通过内核信息…

EasyExcel导出

1.简介 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 2.案例 2.1 实现的效果 效果图如下: 2.2 实现步骤 三种情景,主要是表头和数据有区别,简列实现步骤如下: 2.3 具体实现 2.3.1 前置-依赖导入…

探究element-ui 2.15.8中<el-input>的keydown事件无效问题

一、问题描述 今天看到一个问题&#xff0c;在用Vue2element-ui 2.15.8开发时&#xff0c;使用input组件绑定keydown事件没有任何效果。 <template><div id"app"><el-input v-model"content" placeholder"请输入" keydown&quo…

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

记edusrc一处信息泄露登录统一平台

本文由掌控安全学院 - sbhglqy 投稿 目录 前言 测试思路 免费领取安全学习资料包&#xff01;​ 前言 我们都知道像大学之类的各种平台的登录账号基本上是学号&#xff0c;初始登录密码基本上是学生身份证的后6位再拼接上一些带有学校缩写的英文字母。所以我们在找漏洞的时…

HarmonyOS4.0开发应用(四)【ArkUI状态管理】

ArkUI状态管理 分为以下四个: StateProp和LinkProvide和ConsumeObserved和ObjectLink State 相当于vue中data()内定义的属性变量&#xff0c;相当于react中useState()的使用,即绑定在视图上的响应式变量&#xff0c;可动态更新~ Tip: 标记的变量必须初始化&#xff0c;不可为空…

手把手带你开发Cesium三维场景【3D智慧城市警情预警】

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

VMware之FTP的简介以及搭建计算机端口的介绍

目录 一.FTP的简介 1.1 FTP的作用 二.FTP的搭建 2.1 建立组和用户 2.2 添加角色和功能 2.3 用户绑定组 2.4 配置FTP服务器 2.5 授权 2.5 连接测试 三.计算机端口介绍 3.1 端口分类&#xff1a; 3.2 常见的计算机端口及其用途&#xff1a; 四.附图-思维…

C语言使用蔡勒公式判断日期的星期

引言 在日常编程中&#xff0c;处理日期和时间是一个常见的任务。而了解一个特定日期是星期几&#xff0c;是许多应用程序中的一个基本需求。本篇博客将深入解析一个用于计算星期的 C 语言函数。 代码概览 这个函数使用了蔡勒公式来实现&#xff0c;蔡勒公式&#xff08;Zel…