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

news2024/11/16 1:45:21

接上篇:后端项目操作数据库-中枢组件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.coloradmin.cn/o/1315069.html

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

相关文章

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道:据相关人士报道,苹果希望在未来2到3年内每年在印度生产超过5000万部iphone,要是该计划得以实现,印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示:“此次iPhone15推出是苹果印度制造计划的一…

YOLOv8重要模块解读

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 yolov8的模块代码主要在./ultralytics/nn/modules/下 conv.py 在conv.py文件的头部,__all__中声明了当前模块的所有暴露的模…

LeetCode刷题日志-73矩阵置零

思路一: 用一个同样大小的矩阵记录0的位置,然后遍历矩阵置0, 空间复杂度为O(mn) class Solution {public void setZeroes(int[][] matrix) {int [][] matrix_new new int[matrix.length][matrix[0].length];for(int …

太阳光模拟器助力植物生长研究领域的分析研究

概述 太阳光模拟器是一种精密的光学设备,能够模拟太阳光的波长、强度和分布,为植物生长提供所需的光照环境。在植物生长研究中,太阳光模拟器被广泛应用于探讨植物生长、发育和产量等方面的问题,为农业生产、园艺研究和植物科学提供…

论文阅读——Mask DINO(cvpr2023)

DINO是检测,Mask DINO是检测分割。 几个模型对比: 传统的检测分割中,检测头和分割头是平行的,Mask DINO使用二分图匹配bipartite matching提高匹配结果的准确性。 box对大的类别不计算损失,因为太大了,会…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR(Optical Character Recognition)引擎,用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

23款奔驰C260L升级香氛负离子 淡淡的幽香

相信大家都知道,奔驰自从研发出香氛负离子系统后,一直都受广大奔驰车主的追捧,香氛负离子不仅可以散发出清香淡雅的香气外,还可以对车内的空气进行过滤,使车内的有害气味通过负离子进行过滤,达到车内保持清…

2021年数维杯国际大学生数学建模C题冠状病毒下的旅游业未来发展规划求解全过程文档及程序

2021年数维杯国际大学生数学建模 C题 冠状病毒下的旅游业未来发展规划 原题再现: 旅游业是一个具有高度关联性的复合型产业。它不仅与交通运输业、餐饮业、旅游服务业直接相关,而且与第三产业的大部分行业密切相关。旅游业带动的消费支出主要包括三部分…

springAop有哪五种通知类型?可根据图标查看!

Spring AOP的通知类型有以下几种(后面是图标变化): 1.Before通知: 在目标方法执行前执行。 上白下红,方法前执行。 2.After通知: 在目标方法执行后(无论是否发生异常)执行。 图标…

静态路由的原理和配置

一.路由器的工作原理 首先我们知道路由器是工作在网络层的,那就是三层设备。网络层的功能主要为:不同网段之间通信、最佳路径选择也就是逻辑地址(ip地址)寻址、转发数据。 1.路由器是什么 路由器是能将数据包转发到正确的目的地…

不同的葡萄酒瓶盖会影响葡萄酒饮用的体验

首先,不同的葡萄酒瓶盖会影响我们找到想要喝的葡萄酒的难易程度。螺旋盖、Zork瓶塞和起泡酒“蘑菇形瓶塞”赢得了直接的满足感,它们只需要拔瓶塞不需要开瓶器。来自云仓酒庄品牌雷盛红酒分享对于所有其他的酒瓶封口,我们都需要一个工具来打开…

【Java JVM】实例对象内存布局

当 Java 应用启动后, 基本就是在不断的创建对象, 回收对象的过程中。 而这些创建的对象基本都是存放在应用的堆 (heap) 中, 但是这些对象在堆中又是什么样子的呢? 在这篇文章中, 我们分析一下 Java JVM 中实例对象的内存布局。 在 HotSpot 虚拟机里, 对象在堆内存中的存储布局…

240Wqps,美团用户中台, 如何使用DDD架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&#x…

Canal实时同步MySQL数据到ES

一、canal简介 canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。 早期阿里巴巴因为杭州和美国双机房部署&…

LabVIEW实时建模检测癌细胞的异常

LabVIEW实时建模检测癌细胞的异常 癌症是全球健康的主要挑战之一,每年导致许多人死亡。世界卫生组织指出,不健康的生活方式和日益严重的环境污染是癌症发生的主要原因之一。癌症的发生通常与基因突变有关,这些突变导致细胞失去正常的增长和分…

深度探索Linux操作系统 —— 构建根文件系统

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

漏刻有时数据可视化Echarts组件开发(42)动态创建DIV容器

效果展示 引入外部文件 <script src"js/jquery.min.js"></script><script type"text/javascript" src"js/echarts.5.4.3.min.js"></script>CSS层叠样式表 实现一行3列效果&#xff0c;自动换行&#xff1b; .ecbox {he…

卷积神经网络(CNN)中感受野的计算问题

感受野 在卷积神经网络中&#xff0c;感受野&#xff08;Receptive Field&#xff09;的定义是卷积神经网络每一层输出的特征图&#xff08;feature map&#xff09;上每个像素点在原始图像上映射的区域大小&#xff0c;这里的原始图像是指网络的输入图像&#xff0c;是经过预处…

在开发微信小程序的时候,报错navigateBack:fail cannot navigate back at firstpage

这个错误的意思是&#xff1a;在这个页面已经是第一个页面了&#xff0c;没办法再返回了 报错原因 这个错误原因其实也简单&#xff0c;就是在跳转的时候使用了wx.redirectTo()&#xff0c;使用wx.redirectTo()相当于重定向&#xff0c;不算是从上一个页面跳转过来的&#xf…

C# WPF上位机开发(权限管理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果软件本身是一个人使用&#xff0c;那么基本上不存在权限管理的问题。但是如果软件不是一个人&#xff0c;而是多个人&#xff0c;甚至是不同班…