【Spring AOP】统一异常处理

news2025/6/21 9:55:20

统一异常处理

统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,

  1. 类上面加上 @ControllerAdvice 注解表示控制器通知类
  2. 方法上面加上 @ExceptionHandler 表示异常处理器,并添加异常返回的业务代码

两个结合表示当出现异常的时候执⾏某个通知,也就是执⾏某个⽅法事件,具体实现代码如下:

@ControllerAdvice // 表示针对 Controller 的通知类
public class MyExceptionAdvice {
	// 依靠这个注解, 当出现异常时, 我们就能拿到这个异常
    @ExceptionHandler(Exception.class) // 括号里面是要匹配的异常的类型,表示针对哪种异常的统一处理,如果出现的异常不匹配则拦截不到。
    @ResponseBody // 表示返回的不是静态页面
    public Object handler(Exception e) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("state", -1);
        map.put("data", null);
        map.put("msg", e.getMessage());
        return map;
    }
}

⽅法名和返回值可以⾃定义,其中最重要的是 @ControllerAdvice 和 @ExceptionHandler(Exception.class) 注解。
@ControllerAdvice + @ResponseBody 可以等价替换为 @RestControllerAdvice

以上⽅法表示,如果出现了异常就返回给前端⼀个 HashMap 的对象。

我们可以针对不同的异常,返回不同的结果:

@RestControllerAdvice
public class MyExceptionAdvice {
    @ExceptionHandler(Exception.class) // 能接收所有的异常
    public Object exceptionAdvice(Exception e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state", -1);
        result.put("message", "总的异常信息:" + e.getMessage());
        result.put("data", null);
        return result;
    }

    @ExceptionHandler(NullPointerException.class) // 只能接收空指针异常
    public Object nullPointerExceptionAdvice(NullPointerException e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state", -1);
        result.put("message", "空指针异常:" + e.getMessage());
        result.put("data", null);
        return result;
    }
}

当有多个异常通知时,匹配顺序为当前类 -> 当前类的父类 -> 父类的父类。

比如上述代码出现空指针异常时,虽然上面两个都可以接收 NullPointerException 异常, 但是会优先匹配上 nullPointerExceptionAdvice 这个方法,而不是 exceptionAdvice。

在这里插入图片描述

注意:如果你把异常给 catch 的话,就拦截不到了,并且 catch 之后会影响事务的回滚,所以 Spring Boot 中 try catch 不是想加就加的。

好啦! 以上就是对 统一异常处理 的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

一文带你简单了解一下堡垒机是干嘛的!

随着国家对网络安全的重视&#xff0c;随着等保政策的落地执行&#xff0c;越来越多的企业知道了堡垒机。但对于堡垒机的作用还不是很了解&#xff0c;很多人在问&#xff0c;堡垒机是干嘛的、这里我们小编就跟大家来简单唠唠。 首先我们来看看什么是堡垒机&#xff1f; 堡垒…

VBA入门3——过程和函数 (Sub | Function)

VBA基础入门2 VBA 过程和函数 (Sub | Function)VBA 过程(Sub) 入门教程和实例&#xff08;组织代码的容器&#xff09;无参数过程有参数过程调用子过程&#xff08;Sub&#xff09;调用子过程和函数的基本语法提前退出过程 VBA 函数(Function)入门教程和实例&#xff08;重复使…

Cookies Session JWT

Cookies Cookies是会话跟踪技术的一种&#xff0c;通过将数据保存到客户端的浏览器上以此来达到会话间共享数据的效果。 从打开浏览器开始访问页面直到关闭浏览器断开连接算作一次会话&#xff08;Session&#xff09;&#xff0c;一次会话中可以包含多次请求-响应。每次的请…

【linux】权限相关问题

【linux】权限相关问题 一.用户的分类sudo 二.文件执行的权限i. 文件的分类ii.人的分类三.修改创建文件的权限chmod更改文件创造的默认权限(umask) 三.删除&#xff08;粘滞位&#xff09; 一.用户的分类 在我们使用linux的时候&#xff0c;有用户类型的区分&#xff0c;不同用…

Linux环境下Qt应用程序打包与发布

本文介绍Linux环境下Qt应用程序的打包与发布。 Linux环境下&#xff0c;在开发机器上开发完应用程序&#xff0c;需要部署到其他非开发环境的机器上&#xff0c;这时&#xff0c;需要对开发的Qt应用程序进行打包&#xff0c;以确保可以在其他机器平台&#xff08;非开发环境&a…

20231012_python练习_服务端与客户端数据交互v2_增加xlsx表格数据批量导入数据库

服务端增加根据上传附件格式 xlsx 类型&#xff0c;将表格第一个sheet数据批量快速导入数据库 服务端 import socketserver import json import os #import pymysql import cx_Oracle #Oracle 数据库连接 import time import tqdm import pandas as pd import openpyxlclass …

Linux---(二)基本认识与安装

文章目录 前言一、操作系统的概念、定位二、使用XShell远程登录Linux1.下载安装XShell2.查看 Linux 主机 ip3.使用XShell登录主机4.XShell 下的复制粘贴 前言 一、操作系统的概念、定位 1.操作系统是一款进行软硬件资源管理的软件 硬件资源管理&#xff1a;将CPU、键盘、显示…

uni-app:本地缓存的使用

uni-app 提供了多种方法用于本地缓存的操作。下面是一些常用的 uni-app 本地缓存方法&#xff1a; uni.setStorageSync(key, data): 同步方式将数据存储到本地缓存中&#xff0c;可以使用对应的 key 来获取该数据。 uni.setStorage({key, data}): 异步方式将数据存储到本地缓存…

Leetcode: 931.下降路径最小和(动态规划)

1. 题目解析 LeetCode链接 根据题目可以得出&#xff0c;当处于 [i][j] 位置时只能从 [i - 1][j - 1]&#xff0c;[i - 1][j]&#xff0c;[i - 1][j 1] 这三个位置到达&#xff0c; 所以我们想要得到当前最小的路径和只需要得到上述三个位置的最小值加上该位置的值即可。 2…

Redis(五)

文章目录 一、Redis键值设计&#xff08;一&#xff09;key结构设计&#xff08;二&#xff09;拒绝BigKey什么是BigKey&#xff1f;BigKey的危害如何发现BigKey &#xff08;一&#xff09;恰当的数据类型 二、批处理优化三、服务端优化四、集群最佳实践 一、Redis键值设计 &…

区块链技术在供应链管理中的创新应用

区块链技术以其独特的不可篡改和透明性特点&#xff0c;正在逐步改变供应链管理的传统模式。本文将探讨区块链技术在供应链管理中的创新应用及其带来的效益。 区块链技术的出现为许多行业带来了创新的可能&#xff0c;其中之一就是供应链管理。通过区块链技术&#xff0c;企业可…

记录项目运行起来后在项目的控制台,直接展示抽中奖品的弹框

首先运行项目或者打开线上项目, 在控制台或者项目代码中找到调用出这个弹框的方法, 在控制台直接vm.这个方法() 来调用 可以看到弹框出来了

MyBatis基础之注解与SQL 语句构建器

文章目录 注解实现简单增删改查SQL 语句构建器SelectProvider举例 注解实现简单增删改查 在 MyBatis 的核心配置文件中&#xff0c;你需要配置的不是 mapper 映射文件&#xff0c;而是 Mapper 接口所在的包路径。 <!-- 在配置文件中 关联包下的 接口类--> <mappers&…

【STM32单片机】宠物定时喂食器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED液晶、蜂鸣器、继电器投喂控制等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED液晶显示初始时间&#xff0c;默认工作在自动投…

核心概念:从晶体管到集成电路到摩尔定律

目录 晶体管 集成电路 摩尔定律 总结 这芯片和半导体是不是一回事儿呢&#xff1f;怎么我有时候听人说芯片行业&#xff0c;有时候又听人说半导体行业&#xff0c;好像他们说的都是一回事&#xff1f; 不知道你是不是也有这样的问题。其实啊&#xff0c;这问题很简单&…

arm实验

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再次按下&#xff0c;灭 按键2按下&#xff0c;蜂鸣器叫&#xff0c;再次按下&#xff0c;停 按键3按下&#xff0c;风扇转&#xff0c;再次按下&#xff0c;停 头文件 #ifndef __CTRL_KEY_H__ #define __CT…

python 操作FT232H——(1)准备工作与IO输出方波信号

1.准备工作&#xff1a; python环境&#xff1a; 安装python 环境&#xff0c;我目前使用的是pycharm2023.2.1 community Edition 版本 需要注意设置python解释器的版本及关联本地库&#xff0c;这样就不需要在新的工程中安装库文件了&#xff0c;&#xff08;当然也有缺点&…

Activity页面不显示toolbar

页面显示如下&#xff0c;显示toolbar, 想实现不显示toolbar&#xff0c; 1、在manifest里设置 android:theme"style/AppThemeNoTitle"&#xff0c;可以隐藏&#xff0c;但是整个页面显示为透明的了&#xff0c;activity整体类型发生改变 2、或者设置这个&#xf…

如何逐步掌握STM32开发技巧?

第一步&#xff1a;建立开发环境 选择Keil MDK等开发环境&#xff0c;根据芯片型号安装相应库。 第二步&#xff1a;备齐开发板和资料 选择最小系统板&#xff0c;可自行搭建外围电路&#xff0c;更深入了解硬件。 第三步&#xff1a;了解STM32 观看视频教程&#xff0c;快速…

03 独立看门狗 hal库 stm32cubemx

1.设置配置参数 > 2.初始化 IWDG_HandleTypeDef hiwdg;/* IWDG init function */ void MX_IWDG_Init(void) //Tout((42^prer) rlr) /40 // IWDG_PRESCALER_8 (42^prer) 8/40 *5*2000 64/40 *4095 ---6s {/* USER CODE BEGIN IWDG_Init 0 *//* USER CODE END IWDG_…