java 异常包装

embedded/2024/10/21 20:46:26/

当往数据库里插入数据主键重复时,系统会抛出异常

java.sql.SQLIntegrityConstraintViolationException

这时候我们会自定义一个全局异常处理器去捕获异常。

public class GlobalExceptionHandler {@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public Result handleSQLIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException ex) {log.error("异常信息:用户已存在" );return Result.error("用户已存在");}@ExceptionHandler(Exception.class)public Result HandlerAllExpection(Exception ex) {log.error("异常信息:{}", ex.getMessage());return Result.error(ex.getMessage());}
//TODO 异常处理器的顺序存在问题
}

于是我自定义了一个类去捕获异常,但我发现无论如何捕获该异常,设置异常处理顺序,捕获到这个小异常总是在处理大的全局Expection之后。经过查询是因为

当往数据库中插入数据时,如果主键重复,通常会导致 SQLIntegrityConstraintViolationException 被抛出。这个异常在 Spring 框架中会被进一步包装为更通用的异常类型,主要是 DataIntegrityViolationException

在Java中,异常包装(Exception Wrapping)是一种将一个异常封装在另一个异常中的技术。这种做法可以帮助保留原始异常的堆栈信息,同时添加更多上下文,以便于调试和错误处理。

  1. 保留原始异常信息:通过将原始异常作为参数传递给新的异常,可以保留其堆栈跟踪信息。
  2. 添加上下文信息:新的异常可以包含有助于理解错误上下文的额外信息。
  3. 统一异常处理:可以在不同层次的代码中捕获异常并抛出统一的异常类型,简化错误处理流程。
2. 使用异常包装

接下来,创建一个可能会抛出异常的方法,并在此方法中进行异常包装:

public class ExceptionWrapperExample {public static void riskyMethod() throws CustomException {try {// 可能抛出异常的代码int result = 1 / 0; // 这里会抛出 ArithmeticException} catch (ArithmeticException e) {// 捕获到异常后,抛出自定义异常并包装原始异常throw new CustomException("An error occurred in riskyMethod", e);}}public static void main(String[] args) {try {riskyMethod(); // 调用可能抛出异常的方法} catch (CustomException e) {// 处理自定义异常System.out.println("Caught a CustomException: " + e.getMessage());System.out.println("Original exception: " + e.getCause()); // 获取原始异常e.printStackTrace(); // 打印堆栈跟踪}}
}

输出示例

运行上述代码时,可能会得到类似以下的输出:

Caught a CustomException: An error occurred in riskyMethod
Original exception: java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zeroat ExceptionWrapperExample.riskyMethod(ExceptionWrapperExample.java:5)at ExceptionWrapperExample.main(ExceptionWrapperExample.java:12)

总结

通过异常包装,可以在Java中有效地处理和传递异常。这样做不仅能保持原始异常的信息,还能为上层调用者提供更多的上下文信息。


http://www.ppmy.cn/embedded/129356.html

相关文章

债券市场金融基础设施 (2020版)

前言:我国债券市场格局简介 我国金融市场主要包括货币市场、资本市场、外汇市场、金融衍生工具市场等,其中,资本市场是金融市场重要组成部分,承担着实体经济直接融资的重责,做大做强资本市场对整个国民经济具有重要意义。债券市场是资本市场两大组成部分之一,对提高直接…

Linux——综合实用操作

目录 IP与主机 ping命令 wget命令 curl命令 端口:设备与外界通讯交流的出入口 进程管理 Linux top命令Windows 任务管理器 磁盘信息监控 df iostat 网络状态监控 sar -n DEV命令 环境变量 上传,下载 压缩 解压tar,zip&#xff…

maven学习笔记

maven 学习笔记 一、maven 简介 1.1 maven 介绍 Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 1.2 maven 主要作用理解 有时候我们…

【 用python写一个把视频每一帧提取为png图片】

用python写一个把视频每一帧提取为png图片 在运行此代码之前,请确保您已经安装了OpenCV库。如果没有安装,可以使用以下命令进行安装: pip install opencv-python下面是提取视频帧的Python脚本: import cv2 # 视频文件路径 vide…

《OpenCV计算机视觉》—— 风格迁移

将下图中的图片换一种风格展示出来 如下图结果: 完整代码如下: import cv2image_yuantu cv2.imread("wechat.jpg") image cv2.resize(image_yuantu, dsizeNone, fx0.5, fy0.5) cv2.imshow(yuan tu, image) cv2.waitKey(0)""&q…

UE(其他)

工具界面 Content browser资产管理器针对所有,Outliner仅针对当前map的scene资源 保存新的Map,将当前另存为 Content browser中import导入资源 Setting 鼠标中间Preference(偏好)-》level Editor-》viewport-》mouse Pan 默…

Mysql环境安装

1,下载压缩包 下载压缩包解压 2,配置环境变量 i,高级系统设置-->环境变量-->系统变量-->path-->添加mysql的bin目录路径 ii,新建my.ini文件 basedir:MYSQL的路径 datadir:这个data路径不用手动创建&am…

二十三节补充

考虑如何在不添加公共端demo的情况下同时保存两个视频 更改公共端demo public: void video1_demo(Mat& image); struct TwoImages { Mat img1; Mat img2; }; TwoImages colorSpace_Demo(Mat& image); 将刚刚修改的demo运用到调用的需…