深入理解Java自定义异常与全局异常处理 @RestControllerAdvice

        异常主要是包括编译时的异常运行时的异常。编译时的异常可以通过捕获异常获取,运行时候的异常主要是通过代码规范,或者测试

        Spring Boot提供了两种异常处理方式来统一处理和维护异常信息

        第一种方式是使用@RestControllerAdvice注解与@ExceptionHandler注解配合使用。第二种方式是ErrorController类,因为第一种方式主要是捕获在接口类的异常,如果需要自定义处理特定的HTTP错误代码(404,401),未进入控制器的和自定义错误页面,则需要使用ErrorController。

        一般来说,只使用@RestControllerAdvice+@ExceptionHandler就够了。

  • @ControllerAdvice:可以用来实现对Controller全局异常处理,与传统的基于AOP的方法不同,使用@ControllerAdvice可以捕获所有Controller中抛出的异常,而无需在每个Controller中配置@ExceptionHandler。通过在该类中使用@ExceptionHandler注解,可以根据不同的异常类型定义相应的处理方法。 @ControllerAdvice需要配合@ExceptionHandler一起使用。

  • @RestControllerAdvice是集合了@ControllerAdvice+@ResponseBody的功能,只是以JSON格式返回处理结果。


创建个exception包:在其中创建自定义异常类

自定义异常:

public class SystemException extends RuntimeException {
​private int code;
​private String msg;//获取枚举类中的codepublic int getCode() {return code;}//获取枚举类中的msgpublic String getMsg() {return msg;}
​public SystemException(RespBeanEnum respBeanEnum) {//表示调用父类(RuntimeException)的构造方法,并传入respBeanEnum.getMsg()作为参数super(respBeanEnum.getMsg());this.code = respBeanEnum.getCode();//这个其实是多余的,在super()方法中就已经传了msg,不过便于阅读。this.msg = respBeanEnum.getMsg();}
​
}

        SystemException构造方法的参数是RespBeanEnum:

        定义一个枚举类,列出所有可能的错误类型,并为每个错误类型指定一个对应的错误码和错误消息。然后在自定义异常类中引用该枚举类,并使用其中的错误码和错误消息来初始化异常对象。

public enum RespBeanEnum {   int code;String msg; SUCCESS(200, "操作成功"),ERROR(500, "出现错误");RespBeanEnum(int code, String errorMessage) {this.code = code;this.msg = errorMessage;}public int getCode() {return code;}
​public String getMsg() {return msg;}
}
  • 解释1:

    super(respBeanEnum.getMsg())这个方法是调用父类的构造方法。最上面是:

public Throwable(String message) {fillInStackTrace();detailMessage = message;
}

        它的作用是利用父类的异常处理机制RuntimeExpetion,其包含了父类的一些异常处理机制,如堆栈轨迹,异常链的部分。则得在自定义异常类的构造方法中使用super(msg)

        通过super(respBeanEnum.getMsg())将错误消息传递给父类的构造方法,用于创建一个带有指定错误消息的自定义异常对象 SystemException

通过结合枚举类,可以有以下优势:

  1. 错误分类清晰明确:枚举类可以将各种错误类型进行分类,使得代码的错误处理更具可读性和可维护性。

  2. 统一管理错误信息:在枚举类中定义错误码和错误消息,可以集中管理和维护所有错误信息,方便后续的修改和扩展

  3. 可拓展性:通过扩展枚举类,可以轻松添加新的错误类型,而无需修改和添加大量的代码。

自定义全局异常处理:

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {//处理自定义异常@ExceptionHandler(SystemException.class)public RespBean systemExceptionHandler(SystemException e) {//打印异常信息log.error("出现了异常! {}", e);//从异常对象中获取提示信息封装返回//实际上e.getCode() 和 e.getMsg()返回的值就是枚举类定义的属性值return RespBean.errorResult(e.getCode(), e.getMsg());}//处理其他异常@ExceptionHandler(Exception.class)public RespBean exceptionHandler(Exception e) {//打印异常信息log.error("出现了异常! {}", e);//从异常对象中获取提示信息封装返回return RespBean.errorResult(RespBeanEnum.SYSTEM_ERROR.getCode(), e.getMessage());}
}
ERROR(500, "出现错误"),得到枚举类的code

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

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

相关文章

git clone报错SSL connect error

解决CentOS 6.6上Git操作引发的SSL连接错误问题 最近在处理一个CentOS 6.6服务器上的问题时,遇到了一个比较棘手的问题。我的小伙伴在操作Git时,发现无法执行git pull命令,提示找不到Git组件。在这篇文章中,我会详细介绍我们是如…

金融行业如何数字化转型?_光点科技

金融行业的数字化转型涉及技术创新的引入、客户体验的改善、内部流程的优化、安全和合规性的加强以及员工技能和企业文化的转变。 技术创新 包括云计算、人工智能、大数据分析和区块链技术的采用。云计算增强数据处理的灵活性,AI和机器学习在风险评估和欺诈检测方面…

Linux环境下安装部署MySQL8.0以上(内置保姆级教程)- 离线模式

摘要 本文档适用于在无网的情况下手动部署的MySQL。任何版本均可按照如下步骤进行部MySQL。 并且还讲解了如何修改数据库root账号的密码;以及还讲解了如何开启mysql远程访问权限,允许远程连接。 一、安装前准备工作 1.确认目前服务器上是否存在MySQL…

使用docker/k8s部署项目

1、创建nginx配置文件default.conf server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html 404;}error_page 500 502 503 504 /50x.html…

关于数据mysql ->maxwell->kafka的数据传输

个人名片: 🐅作者简介:一名大三在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

ZYNQ_project:test_fifo_255X8

首先,这个vivado的fifo和quartus有很大不同。 用BRAM来实现异步fifo。 vivado的fifo有复位,在时钟信号稳定后,复位至少三个时钟周期(读写端口的慢时钟),复位完成后30个时钟周期后再进行写操作&#xff08…

微信小程序渲染的富文本里面除了img标签外什么都没有,该如何设置img的大小

微信小程序富文本渲染&#xff1a; <rich-text nodes"{{content}}"style"{{style}}" ></rich-text> content是接口得到的值 let cont object.contentlet a cont.replace(/<img/gi,<img style"max-width:94%;height:auto;margi…

python环境安装教程

1.python解释器安装 python解释器&#xff1a;将书写的代码转换为二进制。 1.打开官网&#xff1a;Welcome to Python.org&#xff0c;点击下载&#xff0c;选择对应的系统和想要下载的python版本进行下载&#xff1a; 2.双击打开下载好的python解释器进行安装&#xff0c;可…

Android 摇一摇功能实现,重力加速度大于15

最近接到需求实现摇一摇需求&#xff0c;不过这个法律限制的很严格&#xff0c;属于敏感地带&#xff0c;实现后又被叫停了。 法律要求&#xff1a; 如果按照规定&#xff0c;操作时间不少于3s就基本没什么跳转了。 实现的话&#xff0c;只考虑了第一条&#xff0c;即&#…

CTFd-Web题目动态flag

CTFd-Web题目动态flag 1. dockerhub注册2. dockerfile编写3. 上传到docker仓库4. 靶场配置5. 动态flag实现 1. dockerhub注册 想要把我们的web题目容器上传到docker仓库中&#xff0c;我们需要dockerhub官网注册一个账号&#xff0c;网址如下 https://hub.docker.com/2. dock…

redis运维(六)redis-cli命令

一 redis-cli 注意&#xff1a; redis-cli核redis-server版本必须适配 --> 见 redis-cli --version提示&#xff1a; 不过一般安装服务端 redis-server 时内置了客户端 redis-cli说明&#xff1a; redis-cli 是 redis 的一种命令行的客户端工具备注&#xff1a; redis-se…

Android 13.0 recovery出厂时清理中字体大小的修改

1.前言 在13.0的系统rom定制化开发中,在recovery模块也是系统中比较重要的模块,比如恢复出厂设置,recovery ota升级, 清理缓存等等,在一些1080p的设备,但是density只是240这样的设备,会在恢复出厂设置的时候,显示的字体有点小, 产品要求需要将正在清理的字体调大点,这…

APP安全加固怎么做?加固技术、加固方法、加固方案

​ 前面的文章中我们为大家介绍了移动应用安全检测的测试依据、测试方法、和测试内容&#xff0c;本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修…

状态模式-

定义&#xff1a;当一个对象的内在状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 适用场景&#xff1a; 1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2、条件、分支语句的代替者&#xff0c;且这些分支依赖于该对象…

常见的数据结构有哪些?

数据结构分为逻辑结构和物理结构。 逻辑结构&#xff1a;指数据元素之间逻辑关系的数据结构&#xff0c;这里的逻辑关系是指数据元素之间的前后间关系&#xff0c;与数据在计算机中的存储位置无关。物理结构&#xff1a;指数据的逻辑结构在计算机存储空间中的存放形式称为数据…

mysql中的各种日志文件redo log、undo log和binlog

mysql中的各种日志文件redo log、undo log和binlog mysql中的各种日志文件redo log、undo log和binlog1.MySQL日志文件类型2.redo log日志2.1 作用2.2工作原理&#xff1a;2.3详解 3.undo log日志4.binlog日志5.总结 mysql中的各种日志文件redo log、undo log和binlog 1.MySQL…

JavaScrip获取视频第一帧作为封面图

在JavaScript中&#xff0c;你可以使用HTML5的<video>元素来加载视频&#xff0c;然后使用Canvas来捕获视频的第一帧作为封面图。以下是一个简单的例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&qu…

常见排序算法实现

&#x1f495;"每一天都是值得被热爱的"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;常见排序算法实现 1.排序的概念 所谓排序&#xff0c;就是按照特定顺序重新排列序列的操作 排序的稳定性&#xff1a; 当一个序列中存在相同的元素时 排序过…

docker小技能:容器IP和宿主机IP一致( Nacos服务注册ip为内网ip,导致Fegin无法根据服务名访问 )

文章目录 I 预备知识1.1 Docker组成1.2 命名空间 (进程隔离)1.3 Docker的网络模式1.4 容器IP和宿主机IP一致1.5 容器时间和服务器时间的一致性II 常用命令2.1 案例:流水线docker 部署2.2 删除没有使用的镜像2.3 shell 不打印错误输出2.4 阿里云流水线/jenkins忽略shell步骤中…

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 教程图形 前言 最近的事情较多&#xff0c;教程更新实在是跟不上&#xff0c;主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙&#xff0c;所有一个人的精力和时间有限&#x…