后端项目全局异常处理-使用RuntimeException自定义异常异常分类简单举例

接上篇:后端项目操作数据库-中枢组件Service调用Mapper
自定义异常: 手动抛出异常,为了后续统一捕获,需要异常自定义;
如:当使用抛出异常的方式表示“操作失败”时,为了后续统一捕获,自定义的异常符合该处理的情景。

1.RuntimeException检查异常&非检查异常

在 Java 中,RuntimeException 及其子类的异常被称为非检查异常(Unchecked Exception),而其他的异常(如 IOException 或 SQLException 等)则被称为检查异常(Checked Exception)。

对于非检查异常,通常是由程序员编写的代码错误引起的,如空指针异常或数组越界异常等。因此,如果程序出现这些异常,通常意味着程序的实现存在问题,需要在代码中进行改进。

相比之下,检查异常则需要在方法的声明或方法调用者的声明中声明抛出此异常。因为检查异常通常由外部因素(如文件操作、网络请求等)引起,并且需要在编写代码时考虑异常处理的情况。可能会导致程序无法正常工作,所以编码时必须将这些异常捕获或向上抛出来保证程序的稳定性和可靠性。

2.后端建议自定义异常,继承RuntimeException

自定义异常必须继承自某个已存在的异常类型,强烈建议继承RuntimeException,其原因有二:

原因1: 在项目中,要想统一处理全局异常,则Service组件、Controller组件都必须抛出异常,才能由Spring MVC框架捕获到异常,进而通过全局异常处理器进行统一的处理!
RuntimeException不会受到异常的相关语句约束,而非RuntimeException一旦被抛出,方法的声明、方法的调用者的声明等都需要声明抛出此异常。
由于抛出异常是固定的做法,没有必要在各个方法上都声明抛出此异常,所以,应该使用RuntimeException

原因2: 配合Spring JDBC框架实现事务管理!

3.异常分类

Java异常体系可以分为以下几个层次:

  1. Throwable:Throwable 是所有异常的根类,它有两个直接子类 Error 和 Exception。

  2. Error:Error 表示系统级别的错误或无法恢复的错误,一般在程序中不捕获和处理 Error,例如 OutOfMemoryError(内存不足)和 StackOverflowError(栈溢出)。

  3. Exception:Exception 表示程序运行时的异常情况,是开发者通常需要处理的异常。Exception 下面又分为两种类型:RuntimeException 和非 RuntimeException。

  4. RuntimeException:RuntimeException 是非检查异常,也称为运行时异常,它们不需要在编码时显式地处理或声明。常见的 RuntimeException 有 NullPointerException(空指针异常)和 ArrayIndexOutOfBoundsException(数组越界异常)。

  5. 非 RuntimeException:非运行时异常是必须进行显示的处理或声明的异常。这种异常是通过 Java 编译器检查的,编译器要求你必须捕获或向上抛出这些异常。常见的非 RuntimeException 有 IOException(输入输出异常)和 ClassNotFoundException(类未找到异常)。

根据这样的分类,开发者可以选择性地处理或声明异常。对于 RuntimeException,可以选择不捕获,而对于非 RuntimeException,必须在代码中显式地捕获或声明,否则程序无法通过编译。
在这里插入图片描述

4.自定义异常-举例

每次抛出异常,都应该是出现了某种“错误”,应该对此“错误”进行描述,关于此描述,应该是“谁抛出,谁描述”!
应该在自定义异常类中添加基于父类异常的带String message参数的构造方法,例如:

public class ServiceException extends RuntimeException {// 关键需要此构造方法public ServiceException(String message) {super(message);}
}

后续,抛出异常时,应该通过以上构造方法封装对异常的描述:

// 检查相册名称是否已经被占用
String name = albumAddNewDTO.getName();
int countByName = albumMapper.countByName(name);
if (countByName > 0) {String message = "添加相册失败,相册名称已经被占用!";log.warn(message);throw new ServiceException(message); // 【调整】在构造方法中封装message
}

后续,捕获异常的位置,将不再需要“猜测”出现异常的原因,而是从捕获到的异常对象中直接获取以上封装的描述信息即可:

try {service.addNew(album);log.debug("添加相册成功!");
} catch (ServiceException e) {log.debug("捕获到异常,其中的消息:{}", e.getMessage()); // 【调整】从异常对象中获取信息
}

参考:异常体系之RuntimeException解析
声明:部分代码来自有网络,文章只供学习参考
创造价值,乐哉分享!

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

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

相关文章

灯具照明行业MES/开源mes/灯具行业免费MES

一、万界星空科技开源MES系统概述: 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理,车间基础数据管理,计划管…

Chapter 7 - 3. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Pause Threshold for Long Distance Links长途链路的暂停阈值 This section uses the following basic concepts: 本节使用以下基本概念: Bit Time (BT): It is the time taken to transmit one bit. It is the reciprocal of the bit rate. For example, BT of a 10 GbE po…

喝葡萄酒时观酒闻香尝味究竟有什么用?

对许多人来说,在品尝葡萄酒时能发现大多数人闻不到的香气和尝不到的味道似乎是一种神奇的能力。其他人则认为这是学究式葡萄酒爱好者过于活跃的想象,或者是保持葡萄酒鉴赏精英声誉的一种方式,但两者都不是。 部分是艺术,部分是科…

目前最火的大模型训练框架 DeepSpeed 详解来了

目前,大模型的发展已经非常火热,关于大模型的训练、微调也是各个公司重点关注方向,但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。…

MBA-数学题概念和公式

{}公差大于零的等差数列:多个数字组成的数列,两两之间差相等,且后值减前值大于0,如:{-2,0,2,4}为公差数列为2的等差数列.因数是指整数a除以整数b(b≠0) 的商正好是整数而没有余数,10的因数为 2和5圆柱体表面积 2πr 2πrh球体表名…

生产环境_Apache Spark技术大牛的实践:使用DataFrame API计算唯一值数量并展示技术(属性报告)

业务背景 给前端提供算法集成好的数据,对算法处理后的数据进行进一步删选展示 可以使用下面代码运行一下看看结果,听有趣的,我写的代码中计算了不同字段的值的数量,并生成了一个显示字符串来描述这些数据的分布情况然后使用"…

MySQL数据库 DDL

目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。 二、操作数据库 (1&am…

Git 使用教程(超级详细)

目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…

C# WPF上位机开发(加密和解密)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在报文传输的过程中,根据报文传输的形态,有两种形式,一种是明文传输,一种是加密传输。当然明文传输…

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型:PythonRequestsPytestYAMLAllure ,主要是针对之前开发的一个接口项目来进行学习,通过 PythonRequests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测…

Git使用rebase和merge区别

Git使用rebase和merge区别 模拟环境使用merge合并使用rebase 模拟环境 本地dev分支中DevTest增加addRole() 远程dev被同事提交增加了createResource() 使用merge合并 使用idea中merge解决冲突后, 推送远程dev后,日志图显示 使用rebase idea中使用功能rebase 解决冲突…

遥感图像分割系统:融合空间金字塔池化(FocalModulation)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 遥感图像分割是遥感技术领域中的一个重要研究方向,它的目标是将遥感图像中的不同地物或地物类别进行有效的分割和识别。随着遥感技术的不断发展和遥感…

Hystrix使用及原理概述

一、背景 1. 当前问题 一个系统,所有请求共用同一个APP容器(Tomcat/jetty/等),共用一个用户线程池,依赖多个不同的远程服务。 当系统健康时,处理请求的延时较低,服务正常运行;当某…

大模型下开源文档解析工具总结及技术思考

1 基于文档解析工具的方法 pdf解析工具 导图一览: PyPDF2提取txt: import PyPDF2 def extract_text_from_pdf(pdf_path):with open(pdf_path, rb) as file:pdf_reader PyPDF2.PdfFileReader(file)num_pages pdf_reader.numPagestext ""f…

漏洞复现-网神SecGate3600防火墙敏感信息泄露漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

算法leetcode|92. 反转链表 II(rust重拳出击)

文章目录 92. 反转链表 II:样例 1:样例 2:提示:进阶: 分析:题解:rust:go:c:python:java: 92. 反转链表 II: 给你单链表的…

迈入数据结构殿堂——时间复杂度和空间复杂度

目录 一,算法效率 1.如何衡量一个算法的好坏? 2.算法效率 二,时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.推导大O的渐进表示法 4.常见时间复杂度举例 三,空间复杂度 一,算法效率 数据结构和算法是密…

迅腾文化品牌网络推广助力企业:保持品牌稳定,发展更多消费者信任,提升品牌忠诚度

迅腾文化品牌网络推广助力企业:保持品牌稳定,发展更多消费者信任,提升品牌忠诚度 在当今快速发展的互联网时代,品牌网络推广已经成为企业发展的重要手段。迅腾文化作为专业的品牌网络推广公司,致力于帮助企业实现品牌…

产品经理之如何编写需求PRD文档(医疗HIS项目详细案例模板)

目录 前言 一.需求文档的含义 二.需求文档的作用及目的 三.编写前的准备 四.需求大纲 五.案例模板 前言 继上两篇的可行性分析文档和竞品分析报告,本篇将继续介绍如何编写PRD文档,并且会附上以医疗项目为例的模板 一.需求文档的含义 需求文…

【C语言(十五)】

动态内存管理 一、为什么要有动态内存分配? 我们已经掌握的内存开辟方式有: int val 20 ; // 在栈空间上开辟四个字节 char arr[ 10 ] { 0 }; // 在栈空间上开辟 10 个字节的连续空间 但是上述的开辟空间的方式有两个特点: • 空间开辟大小是固…