Java中的自定义异常

引言

        Java编程中,异常处理是很关键的一步操作,它可以帮助我们更好的管理程序中的错误问题,Java本身内置了许多异常,但项目中我们需要自定义异常来提升错误问题的可读性和用户的产品体验,本文将深入探讨Java中的自定义异常,包括其原理、用法和最佳实践

异常是什么,如何处理?

        异常是在程序执行过程中发送的不正常情况,它会中断程序的正常流程,Java 使用异常类来表示不同类型的异常情况,这些异常类就继承了异常超类 Throwable

        异常分为两个类型:受检异常和非受检异常

  1. 受检异常:编译时必须被处理的异常,否则程序无法编译通过
  2. 非受检异常:运行时可能发生的异常

        Java中处理异常使用 try-catch 语句块来捕获并处理,在 try 块中包含可能会排除异常的代码,而在 catch 块中则处理相应的异常,如果在 try 块中发生了异常,程序就会立即跳转到相应的 catch 块中进行处理,如果没有匹配的 catch 块,异常会向上抛出,知道被最高层次的异常处理机制捕获或者导致程序终止

自定义异常

        模仿 Java 自带的异常类进行自定义异常类的编写

  1. 继承异常类:如果是自定义受检异常就继承 Exception 类或其子类,如果是自定义非受检异常就继承 RuntimeException
  2. 编写构造方法:合适的构造方法有助于异常信息和对象的传递,通常传递一个字符串用于给用户友好提示即可
  3. 抛出异常:在程序中,使用 throw 语句来抛出自定义异常对象
  4. 捕获和处理异常:使用 try-catch 语句块来捕获和处理自定义异常,catch块中进行异常处理

代码示例

        通常我们自定义异常就是非受检异常,即运行时发生的异常,以下是自定义非受检异常为例所编写的代码实例

承接我的上篇文章,Java中实现RSA非对称加密算法对数据进行加密解密,我们在项目的登录接口中抛出自定义异常编写简单的代码示例

创建存放自定义异常的包

 创建自定义异常类

/*** 自定异常* @author muze*/
public class CustomException extends RuntimeException {@Serialprivate static final long serialVersionUID = -1;/*** 构造函数* @param message 给用户提示的友好信息*/public CustomException(String message) {super(message);}
}

 修改登录接口实现

/*** 用户业务实现层* @author muze*/
@Service
public class UserServiceImpl implements IUserService {/*** 注入用户数据层*/@Autowiredprivate UserMapper userMapper;@Overridepublic String login(UserLoginDTO userLoginDTO) {// 取出用户名和密码String username = userLoginDTO.getUsername();String password = userLoginDTO.getPassword();// 构建查询条件LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<User>().eq(User::getUsername, username);// 查询用户User user = userMapper.selectOne(userLambdaQueryWrapper);//************************  新增密码解密  ************************//String decryptPassword;try {decryptPassword = RSAUtil.decryptByPrivateKey(password);} catch (Exception e) {//************************  抛出自定义异常  ************************//throw new CustomException("用户名或密码错误");}// 如果用户为空或者解密后的输入密码与用户密码不匹配则返回:用户名或密码错误if (user == null || !decryptPassword.equals(user.getPassword())) return "用户名或密码错误";// 使用SaToken的工具类StpUtil调用登录方法login,入参:用户idStpUtil.login(user.getId());// 返回:登录成功return "登录成功";}
}

修改用户控制层

捕获自定义异常并处理

/*** 用户控制层*/
//************************  新增日志打印  ************************//
@Slf4j
@RestController
@RequestMapping("/user")
public class UserLogin {/*** 注入用户业务接口层*/@Autowiredprivate IUserService userService;/*** 登录* @param userLoginDTO 用户登录请求实体* @return 响应码 + 响应消息 + 响应数据*/@PostMapping("/login")public SaResult login(@RequestBody UserLoginDTO userLoginDTO) {//************************  新增捕获自定义异常并处理  ************************//try {return SaResult.ok(userService.login(userLoginDTO));} catch (CustomException e) {// 打印自定义异常信息log.error("自定义异常:", e);return SaResult.error(e.getMessage());}}
}

测试

运行程序,输入未用公钥加密密码进行登录,程序会在密码解密时抛出自定义异常,控制台和接口调用工具可以看到如下结果 

        到这里我们就一起完成了Java中的自定义异常了,相信你已经掌握了,赶快去试试吧,希望这篇文章能对你有所帮助!

彩蛋:细心的你肯定发现了,在实际开发中是见不到控制层去捕获自定义异常并处理的,因为这样会有大量繁琐的重复工作,并且难以维护,不利于我们开发,时间成本也很高,所以我们需要通过AOP面向切面编程的方式去实现全局异常捕获和处理,从而减少繁琐大量重复工作,降低程序的维护难度,节省我们的开发时间,小编会在后续更新一篇与AOP面向切面编程实现全局异常捕获和处理的相关文章,敬请期待!

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

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

相关文章

【深度学习项目】目标检测之YOLO系列详解(一)

介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种实时目标检测算法&#xff0c;由Joseph Redmon等人提出。与传统的基于滑动窗口和区域提案的目标检测方法不同&#xff0c;YOLO将目标检测问题框架化为一个单一的回归问题&#xff0c;直接从图像像素预测边界框和类别…

C# 位运算

一、数据大小对应关系 说明&#xff1a; 将一个数据每左移一位&#xff0c;相当于乘以2。因此&#xff0c;左移8位就是乘以2的8次方&#xff0c;即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…

计算机视觉单阶段实例分割实践指南与综述

概述 原文地址&#xff1a;https://towardsdatascience.com/single-stage-instance-segmentation-a-review-1eeb66e0cc49 实例分割是一项具有挑战性的计算机视觉任务&#xff0c;需要预测对象实例及其每像素分割掩码。这使其成为语义分割和目标检测的混合体。 自 Mask R-CNN …

Oracle中COUNT函数对NULL和空字符串的处理方式

Oracle中&#xff0c;使用COUNT函数的时候&#xff0c;COUNT()和COUNT(null)得到的结果都是0&#xff0c;也就是说&#xff0c;如果我们COUNT中选择的那列属性中为null的或者的那行是不会被计数的。MySQL中count(null)效果和Oracle中一样&#xff0c;但是count()能正常计数。 在…

sqlmap详解

一.sqlmap -u URL --forms sqlmap -u http://192.168.11.136:1337//978345210/index.php --forms 针对特定的 URL 进行 SQL 注入测试&#xff0c;特别是针对表单&#xff08;form&#xff09;的 POST 注入 forms&#xff1a;这个参数告诉 sqlmap 解析并测试目标 URL 中的表单…

Flink CDC Schema Evolution 详解

Flink CDC Schema Evolution 详解 github原文 glimpse flink-cdc-3 glimpse 源码基于 ~/project/flink_src/flink-cdc master !4 ❯ git remote -v origin https://github.com/apache/flink-cdc.git (fetch) origin https://github.com/apache/flink-cdc.git (push) ~/p…

【Linux】结构化命令:if-then语句

结构化命令structured command&#xff1a;允许脚本根据条件跳过部分命令&#xff0c;改变执行流程。 1、if-then语句 格式1&#xff1a; if command then commands fi 格式2&#xff1a; if command; then commands fi 运行if之后的command命令&#xff0c;如果它的退出状态码…

23.DDD与微服务

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现&#xff0c;也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…

Jenkins容器使用宿主机Docker(五)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装&#xff08;三&#xff09; Harbor镜像仓库介绍&安装 &#xff08;四&#xff09; Jenkins容器使用宿主机Docker&#xff08;五&#xff09; Jenkins流水线初体验&#xff08;六&#…

Python爬虫之Scrapy框架基础入门

Scrapy 是一个用于Python的开源网络爬虫框架&#xff0c;它为编写网络爬虫来抓取网站数据并提取结构化信息提供了一种高效的方法。Scrapy可以用于各种目的的数据抓取&#xff0c;如数据挖掘、监控和自动化测试等。 【1】安装 pip install scrapy安装成功如下所示&#xff1a;…

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…

git中的命令

目录 git的命令1.1 创建版本库1.2 添加文件和修改提交文件1.创建文件readme.txt, 此刻文件在工作区&#xff08;WorkSpace&#xff09;2.使用命令 git add readme.txt添加到暂存区里面去。3.提交文件到主分支4.修改文件&#xff0c;在文件中加入一行。查看git的状态 1.3 版本回…

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到&#xff1a;0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束&#xff0c;训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

docker 容器相互访问

目前采用 network 方式 1. 创建自定义网络 docker network create network-group 如下 2. 相互访问的容器更改&#xff08;目前演示redis 以及netcore api 访问redis &#xff09; //redis 原有容器删除 跟之前区别就是加入 --network network-group docker run \ -p 6379:…

YOLOv8目标检测(三*)_最佳超参数训练

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

【rust杂乱笔记】

code . 打开vscode fn main() {println!("hello world!") }loop{}循环; break跳出循环 // 引入三方库 use rand::Rng; // 引入标准库中的输入输出 use std::cmp::Ordering; use std::io;// main函数 先执行main函数 fn main() {// 打印的宏方法// 打印提示信息print…