SpringBoot中全局异常处理

一、全局异常处理

SpringBoot给我们提供了@ControllerAdvice@ExceptionHandler注解

注解的作用:

@ControllerAdvice用来开启全局的异常捕获,

@ExceptionHandler用来说明捕获哪些异常,并对这些捕获的异常进行处理。

二、具体代码样例

@RestControllerAdvice意味着当前类可以用作全局的异常处理器。

handleException 方法是一个异常处理器,使用 @ExceptionHandler(value = Exception.class) 注解标记。这意味着这个方法会处理所有从控制器方法抛出的 Exception 类型的异常(或其子类)。

方法参数包括一个 Exception 对象(捕获的异常)和一个 HttpServletRequest 对象(当前的HTTP请求)。

@RestControllerAdvice //全局异常处理器
@Slf4j
public class GlobalExceptionHandlerController extends BaseController {@ExceptionHandler(value = Exception.class)Object handleException(Exception e, HttpServletRequest request) {log.info("请求错误,请求地址{},错误信息:", request.getRequestURL(), e);ResponseVO response = new ResponseVO();//404if (e instanceof NoHandlerFoundException) {response.setCode(ResponseCodeEnum.CODE_404.getCode());response.setInfo(ResponseCodeEnum.CODE_404.getMsg());response.setStatus(Constants.STATUC_ERROR);} else if (e instanceof BusinessException) {//业务错误BusinessException biz = (BusinessException) e;response.setCode(biz.getCode());if (biz.getCode() == null) {response.setCode(ResponseCodeEnum.CODE_600.getCode());}response.setInfo(biz.getMessage());response.setStatus(Constants.STATUC_ERROR);} else if (e instanceof BindException) {//参数类型错误response.setCode(ResponseCodeEnum.CODE_600.getCode());response.setInfo(ResponseCodeEnum.CODE_600.getMsg());response.setStatus(Constants.STATUC_ERROR);} else if (e instanceof DuplicateKeyException) {//主键冲突response.setCode(ResponseCodeEnum.CODE_601.getCode());response.setInfo(ResponseCodeEnum.CODE_601.getMsg());response.setStatus(Constants.STATUC_ERROR);} else {response.setCode(ResponseCodeEnum.CODE_500.getCode());response.setInfo(ResponseCodeEnum.CODE_500.getMsg());response.setStatus(Constants.STATUC_ERROR);}return response;}
}

异常处理逻辑

  • 首先,使用 log.info 记录异常信息,包括请求的URL和异常详情。
  • 创建一个 ResponseVO 对象,用于构建返回给客户端的响应。
  • 使用 if-else 语句对不同类型的异常进行不同的处理:
    • NoHandlerFoundException: 当没有合适的处理器方法处理请求时抛出。返回404错误码。
    • BusinessException: 业务逻辑异常。返回业务错误码和错误信息。
    • BindException: 参数绑定异常(例如,请求参数类型不匹配)。返回600错误码。
    • DuplicateKeyException: 数据库主键冲突异常。返回601错误码。
    • 其他异常: 默认情况下,返回500错误码。
  • 在每种情况下,都设置 ResponseVO 对象的 codeinfo 和 status 属性,然后返回这个对象。

三、总结

通过这种方式,当控制器中发生异常时,这个全局异常处理器会捕获这些异常,统一处理,并返回一个格式化的错误响应给客户端。这有助于保持API的一致性,并提供友好的错误提示信息。

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

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

相关文章

前端学习之路(6) npm详解

npm 是什么? npm(node package manager):node.js 的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) ,npm 是随同 node.js 一起安装的包管理工具,能解决 node.j…

《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)

题目链接:LCR 036. 逆波兰表达式求值 - 力扣(LeetCode) 题目: 后缀表达式是一种算术表达式,它的操作符在操作数的后面。输入一个用字符串数组表示的后缀表达式,请输出该后缀表达式的计算结果。假设输入的…

MySQL基础查询篇(7)-常用的字符串函数

MySQL数据库是目前广泛应用于各种系统中的一种关系型数据库管理系统。在MySQL中,有许多常见的字符串函数,可以对字符串进行各种处理和操作。本文将介绍MySQL数据库中常用的一些字符串函数,并提供详细示例。 CONCAT函数:用于将两个…

小项目:蓝牙模块点亮RGB三色灯

在之前的教程中,我们学习了蓝牙模块的原理,并动手写了驱动,实现了串口的接收和发送。本次我们就来教大家如何使用蓝牙串口控制灯。这是一个简单的示例,展示了如何将蓝牙通信与硬件控制相结合,实现远程控制的功能。你也…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息,统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

tsgctf-2021-lkgit-无锁竞争-userfaultfd

启动脚本 qemu-system-x86_64 \-kernel ./bzImage \-initrd ./rootfs.cpio \-nographic \-monitor /dev/null \-cpu kvm64,smep,smap \-append "consolettyS0 kaslr oopspanic panic1 quiet" \-no-reboot \-m 256M题目 lkgit_hash_object #define HASH_SIZE …

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念:程序的一个执行实…

QGIS介绍

一.基本概念 QGIS的官方网站为:https://www.qgis.org Github地址:https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2)发布,主要采用C语言开发,用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML(Unified Modeling Language)是一种通用的建模语言,广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具,通过简单的文本描述,能够生成UML图,包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称,我们之前认识了进程的概念,现在我们来了解一下线程的概念 线程概念: 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定…

Linux命令-base64命令(编码/解码文件或标准输入输出)

说明 base64将 文件 或 标准输入 编码或解码为标准输出; 语法 base64 [OPTION]... [FILE]参数 -d, --decode # 解码 -i, --ignore-garbage # 解码时,忽略非字母字符 -w, --wrapCOLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行--help # 显示此帮助…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接: 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record,示例内容如下:。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

OpenAI使用的海量数据集介绍

1. OpenAI使用的数据 OpenAI为了训练其尖端的自然语言处理模型,如GPT-4,采用了极为庞大的数据集。虽然具体的细节可能不完全公开,但我们可以根据历史信息和公开报道推测,这些数据集通常包含: WebText:早期…

ComfyUI 学习笔记

目录 ComfyUI 入门教程 什么是ComfyUI? windows安装教程: 组件技巧学习 ComfyUI 入门教程 老V带你学comfyUI-基础入门 - 知乎 什么是ComfyUI? ComfyUI 是一个基于节点的 GUI,用于Stable Diffusion。你可以通过将不同的no…

conda创建环境,查看环境,激活环境,查看包,复制环境,删除环境,查看cuda版本,查看pytorch版本

创建环境 conda create --name [yourEnvname]查看环境 conda env list首次激活 conda 虚拟环境,使用source activate激活,以后可以使用 conda activate 激活虚拟环境 source activate [yourEnvname]激活环境 conda activate [yourEnvname]查看环境下…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程, 面向过程就是一步一步去操作,你需要知道每一步的步骤。 面向对象的编程以对象为核心,通过定义类描述实体及其行为,并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口,其中21端口可以匿名FTP登录,好像有点说法,百度搜索一下发现可以用anonymous登录…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受——同一批次这样的人可以有多个!!!如果 pta 分数不低于 175 &#…