后端项目全局异常处理-使用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解析
声明:部分代码来自有网络,文章只供学习参考
创造价值,乐哉分享!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息过载的反思

在今天微信、短视频、图文不停的密集的信息轰炸之下,你“察觉”到你的精力不济没有?你时常会觉得耳鸣、目涩,注意力无法集中;你懒于记忆,甚至爱人的手机号都想不起来,习惯于用移动电话找人名,不…

Docker - Android源码编译与烧写

创建源代码 并挂载到win目录 docker run -v /mnt/f/android8.0:/data/android8.0 -it --name android8.0 49a981f2b85f /bin/bash 使用 docker update 命令动态调整内存限制: 重新运行一个容器 docker run -m 512m my_container 修改运行中容器 显示运行中容器 d…

使用飞书自定义机器人发送消息

使用飞书机器人可以很方便的获取自动化任务的反馈: 在群里创建一个机器人: 记住下面的 webhook地址,这个是标识机器人的唯一ID,比如它的webhook地址是:"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx-a…

【1.计算机组成与体系结构】流水线技术

目录 1.流水线的定义2.相关参数计算2.1 流水线计算公式2.2 流水线的吞吐率2.3 流水线加速比计算 3.超标量流水线 1.流水线的定义 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,它们可同时为多条指令…

STM32——超声波传感器

需求: 使用超声波测距,当手离传感器距离小于 5cm 时, LED1 点亮,否则保持不亮状态 接线: 定时器配置: 使用 TIM2 ,只用作计数功能,不用作定时。 将 PSC 配置为 71 ,…

笔记 - 现代嵌入式芯片封装识读

0.引用: 配图、资料并非一处采集,我不太容易找到图片的原始链接。这里的图片仅作示例,无商业用途。如果涉及侵权,请随时联系。谢谢! PCB封装欣赏了解之旅(下篇)—— 常用集成电路_ufqfpn封装…

什么是Z-Wave,技术特点,各国支持的频段

1.1 背景 Z-Wave是一种无线通信的协议,主要应用于智能家居网络,而其Z-Wave联盟主要是推动家庭自动化领域采用Z-Wave协议,其联盟成员都是智能家居领域非常有名的厂商,基本上覆盖了全球。 2.1 技术特点 低功耗、高可…

『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略

『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略 1 Appium-Inspector简介2 Appium Desktop中的Appium-Inspector3 安装Appium-Inspector4 Appium-Inspector网页版5 Appium-Inspector界面说明5.1 Appium Server配置5.2 Selec…

飞致云与上海吉谛达成战略合作,获得Gitea企业版中国大陆地区独家代理权

2023年12月13日,中国领先的开源软件提供商FIT2CLOUD飞致云宣布与上海吉谛科技有限公司(以下简称为上海吉谛)正式达成战略合作,FIT2CLOUD飞致云获得上海吉谛旗下代码托管平台Gitea企业版中国大陆地区独家代理权。 Gitea项目&…

使用 Pnpm 和 Vite 构建 Vue 项目

文章目录 本地 Node 环境安装 Pnpm 包管理工具使用 Vite 创建 Vite 官网:https://cn.vitejs.dev/ 本地 Node 环境 首先,确保已经安装了 Node.js 和 npm。可以在命令行中运行 node -v 和 npm -v 来检查它们是否已经正确安装: 安装 Node.js 通…

【Git 小妙招】走进 Git 的分支管理(万字图文讲解)

文章目录 前言1. 理解分支2. 创建分支3. 切换分支4. 合并分支5. 删除分支6. 合并冲突7. 分支管理策略7.1 一个简单的分支策略(仅参考) 8. bug 分支9. 删除临时分支总结 前言 本文开始介绍 Git 的杀手级功能之⼀:分⽀。本文涉及分⽀创建,切换&#xff0c…

2. 基础数据结构-数组

2. 基础数据结构-数组 2.1 概念 数组是一种数据结构,它是一个由相同类型元素组成的有序集合。在编程中,数组的定义是创建一个具有特定大小和类型的存储区域来存放多个值。数组可以是一维、二维或多维的。每个元素至少有一个索引或键来标识。 2.2 数组特…

Leetcode—113.路径总和II【中等】

2023每日刷题(五十七) Leetcode—113.路径总和II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

【数谷·企声】贵州恩典集团:半年内实现上规入统,大力推广贵州酱酒品牌

近年来,贵阳贵安大力实施“数字活市”战略,数字产业高速增长,数字红利加速释放,营商环境持续优化,成功吸引了一批批优质企业落户,贵州恩典企业管理(集团)有限公司(以下简…

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构,在网上有很多的学习资料,这里只介绍些容易混淆的概念,作为回看笔记。 1. 传输语法 每个传输语法,起都是表达的三个概念:大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

Linux 常用的操作命令

我们习惯的使用Windows,安装软件进行使用,比如 WPS,浏览器,一些工具,但是在Linux上就需要用命令去操作,也可以使用像Ubuntu 和 CentOS这类的可视化面板 Linux系统是开源的,所以开发人员可以反复的发现Bug以…

高项备考葵花宝典-项目进度管理核心方法加强理解-关键路径法

关键路径法(Critical Path Method,CPM)是一种基于数学计算的项目计划管理方法,是网络图计划方法的一种,属于肯定型的网络图。关键路径法将项目分解成为多个独立的活动并确定每个活动的工期,然后用逻辑关系&…

​hashlib --- 安全哈希与消息摘要​

源码: Lib/hashlib.py 本模块针对许多不同的安全哈希和消息摘要算法实现了一个通用接口。 包括了 FIPS 安全哈希算法 SHA1, SHA224, SHA256, SHA384, SHA512, (定义见 the FIPS 180-4 standard), SHA-3 系列 (定义见 the FIPS 202 standard) 以及 RSA 的 MD5 算法 (…

首场“解数Talk” 直播来了——大模型语料数据联盟开源数据集解读

一、解数 Talk 介绍 为帮助广大开发者更好地了解大模型语料数据联盟发布的AI大模型语料数据,沟通大模型企业在AI视角下的数据需求,不断服务大模型产业生态和落地应用,联盟发起单位上海人工智能实验室联合成员单位共同打造“解数 Talk”系列直…

智能优化算法应用:基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.引力搜索算法4.实验参数设定5.算法结果6.…