SpringBoot中的异常处理器

我们在以上的开发中,统一使用Result返回固定的数据格式给到前端,但是由于程序可能会出现BUG等问题,会导致最终返回给前端的数据,在异常情况下就又不统一了

为了实现在异常情况出现时,也能正常给前端返回统一的数据格式,我们需要使用 异常处理器

定义异常处理器需要使用@RestControllerAdvice注解,代表被修饰的类是一个可以处理全局异常的类:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {}

使用了以上注解的类,就可以接收系统中出现的异常了,但是异常出现以后,怎么处理就需要专门的处理方法来处理了.

我们可以定义一个方法,使用@ExceptionHandler注解来修饰,并且标明它可以处理什么类型的异常:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {// 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)// 使用@ExceptionHandler注解标明此方法处理的是何种异常@ExceptionHandler(Exception.class)public Result doException(Exception ex) {return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);}
}

以上被@ExceptionHandler修饰的方法,可以处理任何异常。因为它的参数是Exception.class。

接管异常后,SpringBoot框架会自动把异常处理对象注入到方法形参ex上,我们可以直接使用此异常对象

但是以上使用,@ExceptionHandler(Exception.class)来处理异常,就太宽泛了,怎么能处理更加精确的异常呢?

可以写专门的方法,使用@ ExceptionHandler注解标明接管精准的异常:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {// 如果这里定义了更加精确的异常处理方法// 优先会由精确方法处理@ExceptionHandler(ArithmeticException.class)public Result  doArithmeticException(ArithmeticException ex) {return new Result(Code.ERROR, "数学运算错误", null);}// 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)// 使用@ExceptionHandler注解标明此方法处理的是何种异常@ExceptionHandler(Exception.class)public Result doException(Exception ex) {return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);}
}

如果出现的是ArithmeticException类型的异常,doArithmeticException()方法就会被调用。那么最后的托管的doExeption()方法就不被调用了。

最后还有一个问题,我们总不能在异常处理器中,把所有的异常情况都列出来吧?

那时不可能的,太麻烦了.此时我们可以将异常收纳成自己项目里的异常类型:

定义一个自己的异常类:

@Data
public class BusinessException extends RuntimeException{private Integer code;// 重写RuntimeException的两个构造方法public BusinessException(Integer code, String message){super(message);this.code = code;}public BusinessException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}}

在出现异常的地方捕获异常后,再抛出我们自己定义的异常即可.

此时我们就可以统一接收自己的异常了

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {// 接收我们自己定义的异常@ExceptionHandler(BusinessException.class)public Result doMyException(BusinessException ex){return new Result(ex.getCode(), ex.getMessage(), null);}// 如果这里定义了更加精确的异常处理方法// 优先会由精确方法处理@ExceptionHandler(ArithmeticException.class)public Result  doArithmeticException(ArithmeticException ex) {return new Result(Code.ERROR, "数学运算错误", null);}// 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)// 使用@ExceptionHandler注解标明此方法处理的是何种异常@ExceptionHandler(Exception.class)public Result doException(Exception ex) {return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);}
}

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

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

相关文章

图形系统开发实战课程:进阶篇(上)——10.应用实例:交通路网

图形开发学院|GraphAnyWhere 课程名称:图形系统开发实战课程:进阶篇(上)课程章节:“图形样式”原文地址:https://www.graphanywhere.com/graph/advanced/2-10.html 第十章 应用实例:交通路网 \quad 在前面几…

国家积极推进长城国家文化公园建设

长城脚下,文化绽放——国家积极推进长城国家文化公园建设 在中华大地的北方,横亘着一条巨龙,它见证着中华民族的沧桑岁月,承载着我们的民族记忆,它就是——长城。这座千年的雄关,不仅是中国的象征&#xf…

平面纯弯梁单元Matlab有限元编程 |欧拉梁单元| 简支梁|悬臂梁|弯矩图 |变形图| Matlab源码 | 视频教程

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

chatgpt与人类有何不同?

ChatGPT和人类之间存在多个显著的差异。 首先,ChatGPT是一种基于人工智能技术的计算机程序,通过机器学习和自然语言处理等技术,从大量的数据中获取知识并生成语言输出。它主要依赖于算法和数据进行工作,能够迅速处理和检索信息&a…

10、Linux项目部署-WAR包、JAR包

一、WAR包 第一步,把War包解压,再重新打包成Zip。 第二步,在Linux里创建一个项目文件夹,将Zip的内容解压在这个文件夹内。 例如,创建的项目文件夹是/usr/local/software/project1 第三步,修改Tomcat配置…

一款高输出电流 PWM 转换器

一、产品描述 TPS543x 是一款高输出电流 PWM 转换器,集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器(可在瞬态条件下提供高稳压精度)、欠压锁定电路(用于防止在输入电压达到 5.5V 前启动&…

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题: 2. 现在的问题是只读不写!32行就是写入部分的代码: 3. 很奇怪,调试的时候确实是写进来了 程序正常执行后,文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

一篇文章带你通关并查集(持续更新中)

这篇文章的所有题目均来自于自行整理,代码均来自于自行梳理调试(思路可能比较暴力)。初衷在于整理练习思路,且起到督促自己学习的作用 本文分成将三个模块 1.普及组 (洛谷黄题) 2.提高组 (洛…

Vue3+ts(day01:Vue3简介、初始化Vue3工程)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

响应式编程五股票订阅系统实现

响应式编程五 使用StepVerifier测试响应式流StepVerifier要点 使用StepVerifier进行高级测试股票订阅系统数据库表 使用StepVerifier测试响应式流 出于测试目的,Reactor 提供了额外的 reactor-test 模块,该模块提供了 StepVerifier。StepVerifier 提供了…

简易网络聊天室:2024/3/7

思维导图 基于UDP的简易网络聊天室 服务器&#xff1a; #include <myhead.h>#define SER_PORT 8888struct msgTyp //存储消息的结构体 {char type; //消息类型char name[30]; //用户姓名char text[1024]; //消息正文 };//创建链表存储客户端信息 typedef stru…

JavaWeb04-Request,Response

目录 一、Request&#xff08;请求&#xff09; 1.作用 2.继承体系 3.获取请求数据 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体&#xff08;POST&#xff09; &#xff08;5&#xff09;Request通用方式获取请求…