当前位置: 首页 > news >正文

SpringBoot——全局异常处理

目录

异常

项目总结

新建一个SpringBoot项目

pom.xml

Result(通用的响应结果类)

MyBusinessException自定义异常类

GlobalExceptionHandler全局异常处理类

ExceptionController控制器

SpringbootExceptionApplication启动类


参考文章:

  • 1、http://t.csdnimg.cn/wzes2

异常

  • SpringBoot项目采用了全局异常的概念——所有方法均将异常抛出,并且专门安排一个类统一拦截并处理这些异常。
  • 对异常的处理:
    • 1、抛出异常
    • 2、使用 try...catch...finally 捕获处理异常
  • SpringBoot提供了两个注解用于拦截异常
    • 1、@ControllerAdvice:标注该类为全局异常处理类,默认拦截所有被触发的异常
    • 2、@ExceptionHandler:标注方法,用于处理特定异常
异常的分类
java.lang.Throwable(所有异常类的根类)

java.lang.Error

(错误信息)

  • 由Java虚拟机生成并抛出
  • 这类错误一般不处理
java.lang.Exception(异常信息)
StackOverFlowError:栈空间溢出错误

检查期异常

  • 在方法上固定存在的,如果调用了该方法就必须处理此异常

java.lang.RuntimeException

(运行时异常)

OutOfMemoryError:内存溢出错误java.io.IOException:I/O异常java.lang.NullPointerException:空指针异常
IllegalAccessError:非法的访问权限错误java.io.FileNotFoundException:文件找不到异常

java.lang.IndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException:数组越界异常

NoClassDefFoundError:JVM未找到类错误java.io.ClassNotFoundException:类找不到异常java.lang.IllegalArgumentException:非法参数异常
NoSuchMethodError:JVM未找到方法错误java.lang.SecurityException:安全异常java.util.ConcurrentModificationException:修改状态异常

项目总结

  • 统一异常处理通过@ControllerAdvice注解向控制器发送通知,并接收所有Controller层的通知,再结合@ExceptionHandler注解对指定的异常进行捕获处理,最后将结果返回给用户

新建一个SpringBoot项目

项目结构:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>springboot_exception</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_exception</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Result(通用的响应结果类)

Result类的作用:

  1. 统一的响应格式:提高接口的一致性和可维护性。
  2. 封装错误信息:当发生异常或错误时,可以使用Result类来封装错误信息,包括错误消息和对应的状态码,便于客户端进行统一的处理和解析。
  3. 携带业务数据:除了错误信息,Result类也可以携带业务数据,例如查询结果、对象详情等,从而完整地描述接口的执行结果。
package com.study.springboot_exception.event;import lombok.Data;@Data
public class Result<T> {private String message;private int code;private T data;
}

MyBusinessException自定义异常类

package com.study.springboot_exception.exception;import lombok.Data;/*** 自定义异常类: 用于及时处理一些不符合业务逻辑的数据* 注意:* 1.必须继承RuntimeException运行时异常,并重写父类构造方法*/
@Data
public class MyBusinessException extends RuntimeException{private static final long serialVersionUID=1L;private int code;private String message;public MyBusinessException(String message){super(message);this.message=message;}public MyBusinessException(int code,String message){super(message);this.code=code;this.message=message;}}

GlobalExceptionHandler全局异常处理类

  • 比较常见的错误状态:
    • 200:正常响应
    • 400:错误的请求
    • 404:资源不存在
    • 500:代码无法继续执行
  • SpringBoot项目是Restful风格,大多使用@RestControllerAdvice注解
package com.study.springboot_exception.exception;import com.study.springboot_exception.event.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.StringJoiner;/*** 全局异常处理类*/
@Slf4j
@RestControllerAdvice//标记该类为全局异常处理类
public class GlobalExceptionHandler {/*** 处理自定义异常*/@ExceptionHandler(MyBusinessException.class)//处理特定异常public Result handleBizException(MyBusinessException ex){Result<Object> result=new Result<>();result.setCode(ex.getCode());result.setMessage(ex.getMessage());return result;}/*** 参数校验不通过异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){StringJoiner sj=new StringJoiner(";");ex.getBindingResult().getFieldErrors().forEach(x -> sj.add(x.getDefaultMessage()));Result<Object> result=new Result<>();result.setCode(505);result.setMessage(sj.toString());return result;}/*** Controller参数绑定错误*/@ExceptionHandler(MissingServletRequestParameterException.class)public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException ex){Result<Object> result=new Result<>();result.setCode(506);result.setMessage(ex.getMessage());return result;}/*** 其他未知异常(拦截的是全局最底层异常,兜底)*/@ExceptionHandler(value=Exception.class)public Result handleException(Exception ex){Result<Object> result=new Result<>();result.setCode(507);result.setMessage("服务器内部错误");return result;}
}

ExceptionController控制器

package com.study.springboot_exception.controller;import com.study.springboot_exception.event.Result;
import com.study.springboot_exception.exception.MyBusinessException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** 处理系统中可能出现的两种异常:产品空指针异常和自定义异常*/
@RestController
public class ExceptionController {/*** 系统内部错误*/@GetMapping("/exception")public Result testException(){int i=1/0;//该语句会触发算数异常,进入全局异常处理类,所以不会执行下面的语句Result<Object> result=new Result<>();result.setCode(200);result.setMessage("success");result.setData("cc");return result;}/*** 自定义异常*/@GetMapping("/myException")public Result testMyException(){throw new MyBusinessException(508,"自定义的异常");}
}

SpringbootExceptionApplication启动类

package com.study.springboot_exception;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootExceptionApplication {public static void main(String[] args) {SpringApplication.run(SpringbootExceptionApplication.class, args);}}

 启动项目

  • 访问网址:http://localhost:8080/exception
  • int i=1/0; 会触发算术异常,在全局异常处理类中归属“其他未知异常”来进行处理

访问网址:http://localhost:8080/myException,触发自定义异常 

相关文章:

SpringBoot——全局异常处理

目录 异常 项目总结 新建一个SpringBoot项目 pom.xml Result&#xff08;通用的响应结果类&#xff09; MyBusinessException自定义异常类 GlobalExceptionHandler全局异常处理类 ExceptionController控制器 SpringbootExceptionApplication启动类 参考文章&#xff1a…...

SpringBoot+Vue教师工作量管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图...

华为OD技术面试-最长回文串-2024手撕代码真题

题目:最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最…...

Python实现连连看8

4 游戏开始 连连看游戏实际上主要完成的是对玩家鼠标点击事件的处理,也就是对鼠标点击事件的响应。 4.1 添加鼠标点击事件响应 在“1.3.4 在窗口上铺设画布”中提到的将画布pack()到窗口代码之前,写入如下代码,其功能是为鼠标点击事件添加响应。 canvas.bind(<Button…...

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路&#xff1a;通过阻断冗余…...

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…...

JVM学习-详解类加载器(二)

双亲委派机制 双亲委派优势 避免类的重复加载&#xff0c;确保一个类的全局唯一性 Java类随着它的类加载器一起具备了一种带有优先级的层次关系&#xff0c;通过这种层次关系可以避免类的重复加载&#xff0c;当父类已经加载了该类&#xff0c;就没有必要子ClassLoader再加载…...

数字校园的优势有哪些

数字化时代下&#xff0c;数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造&#xff0c;提供全新的教学、管理和服务方式。那么&#xff0c;数字校园究竟具备何种优势&#xff1f;现从三个方面为您详细介绍。 首先&#xff0c;数字校园为教…...

DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析

前言 2023年7月&#xff0c;我司组建大模型项目开发团队&#xff0c;从最开始的论文审稿&#xff0c;演变成目前的两大赋能方向 大模型应用方面&#xff0c;以微调和RAG为代表 除了论文审稿微调之外&#xff0c;目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论…...

【Mtk Camera开发学习】01 MTK 平台Camera BringUp

本专栏内容针对 “知识星球”成员免费&#xff0c;欢迎关注公众号&#xff1a;小驰行动派&#xff0c;加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台&#xff0c;Camera BringUp会涉及到修改的模块。 MTK不同的平台系列&#xff0c;具体修改…...

新能源汽车内卷真相

导语&#xff1a;2025年&#xff0c;我国新能源汽车总产能预计可达3661万辆&#xff0c;如此产能如何消化&#xff1f; 文 | 胡安 “这样卷下去不是办法&#xff0c;企业目的是什么&#xff1f;是盈利&#xff0c;为国家作贡献&#xff0c;为社会作贡献。我们应该有大格局&…...

C 语言实现在终端里输出二维码

Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…...

nodejs---fs模块,文件读写操作详解,自定义一个文件写入方法

fs模块导入 Node.js 同时支持 CommonJS 和 ES 模块系统&#xff08;自 Node.js v12 以来&#xff09; // 两种模块导入方式 import * as fs from fs;// Es6:这种方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…...

Linux(Rocky)下 如何输入中文(切换中文输入法)教程

RockyLinux如何输入中文&#xff08;切换中文输入法&#xff09; 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…...

Python中包(package)与模块(module)的概念 以及 import 问题

目录 Python中 包(package) 与 模块(module) 的概念一. Python中, 包 (package) 与 模块 (module) 的概念1. 一个有 __init__.py 文件 的目录, 被视为一个 Python 的 包 (package)2. 一个Python源文件 , 被视为一个模块 (module) 二. 不同包之间 以及 同一个包的不同模块之间的…...

Android常见内存泄漏场景总结

一、非静态内部类造成的内存泄漏 造成原因&#xff1a;非静态内部类默认会持有外部类的引用&#xff0c;如果内部类的生命周期超过了外部类就会造成内存泄漏。 场景&#xff1a;当Activity销毁后&#xff0c;由于内部类中存在异步耗时任务还在执行&#xff0c;导致Activity实…...

未来已来:Angular、React、Vue.js——前端框架的三大巨头

目录 前言 一、Angular框架 特点和优势 核心技术和应用场景 二、React框架 特点和优势 核心技术和应用场景 三、Vue.js框架 特点和优势 核心技术和应用场景 总结&#xff1a; 前言 在Web前端开发领域&#xff0c;随着技术的不断发展&#xff0c;出现了众多优秀的框…...

Mybatis06-动态SQL

动态SQL 1.什么是动态SQL 什么是动态SQL&#xff1a;动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 类似JSTL标签 官网描述&#xff1a; MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接…...

26-LINUX--I/O复用-select

一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符&#xff0c;对提高程序的性能有很大帮助。以下情况适用于I/O复用技术&#xff1a; ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…...

spring源码解析-(2)Bean的包扫描

包扫描的过程 测试代码&#xff1a; // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…...

Java 数学计算 - Random类

在Java中&#xff0c;Random类用于生成伪随机数。这个类在java.util包中&#xff0c;你可以使用它来生成整数、浮点数等不同类型的随机数。以下是关于Random类的一些学习笔记和示例。 1. 创建Random对象 首先&#xff0c;你需要创建一个Random对象。默认情况下&#xff0c;如…...

Ubuntu22.04之解决:无法关机和重启问题(二百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

大学数字媒体艺术设计网页设计试题及答案,分享几个实用搜题和学习工具 #媒体#职场发展

现在读书可不像小时候&#xff0c;以前想要校对试题答案&#xff0c;都得找到对应的纸质版答案查看&#xff0c;而且有的还只有答案&#xff0c;没有解析&#xff0c;无法弄清楚答案的由来。但是现在不一样了&#xff0c;现在我们可以通过搜题软件&#xff0c;寻找试题的答案&a…...

【ArcGIS微课1000例】0119:TIFF与grid格式互相转换

文章目录 一、任务描述二、tiff转grid三、grid转tif四、注意事项一、任务描述 地理栅格数据常用TIFF格式和GRID格式进行存储。TIFF格式的栅格数据常以单文件形式存储,不仅存储有R、G、B三波段的像素值,还保存有地理坐标信息。GRID格式的栅格数据常以多文件的形式进行存储,且…...

B3870 [GESP202309 四级] 变长编码

[GESP202309 四级] 变长编码 题目描述 小明刚刚学习了三种整数编码方式&#xff1a;原码、反码、补码&#xff0c;并了解到计算机存储整数通常使用补码。但他总是觉得&#xff0c;生活中很少用到 2 31 − 1 2^{31}-1 231−1 这么大的数&#xff0c;生活中常用的 0 ∼ 100 0…...

WordPress网站更换域名后如何重新激活elementor

在创建WordPress网站时&#xff0c;我们常常需要更改域名。但是&#xff0c;在更换域名后&#xff0c;你可能会遇到一个问题&#xff1a;WordPress后台中的Elementor插件授权状态会显示为不匹配。这时&#xff0c;就需要重新激活Elementor插件的授权。下面我会详细说明如何操作…...

linux cron 执行url

linux cron 执行url 在Linux中&#xff0c;你可以使用curl或wget来执行URL。如果你想要定期执行这个操作&#xff0c;可以使用cron来设置定时任务。 以下是一个使用curl在cron中执行URL的例子&#xff1a; 打开终端。 输入 crontab -e 命令来编辑你的cron作业。 添加一个新…...

压缩视频在线压缩网站,压缩视频在线压缩工具软件

在数字化时代&#xff0c;视频成为了人们记录和分享生活的重要载体。然而&#xff0c;视频文件一般都非常大&#xff0c;这不仅占据了大量的存储空间&#xff0c;也给视频的传输和分享带来了不便。因此&#xff0c;压缩视频成为了许多人必须掌握的技能。本文将详细介绍如何压缩…...

linux经典例题编程

编写Shell脚本&#xff0c;计算1~100的和 首先vi 1.sh,创建一个名为1.sh的脚本&#xff0c;然后赋予这个脚本权限&#xff0c;使用命令chmod 755 1.sh&#xff0c;然后就可以在脚本中写程序&#xff0c;然后运行。 shell脚本内容 运行结果&#xff1a; 编写Shell脚本&#xf…...

二叉树的实现(初阶数据结构)

1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出&#xff1a; 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分&#xff0c;次序不能…...

网站建站网站设计/网络营销的发展现状如何

0.前言随机访问迭代器: vector、string、dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c提供的容器:标准STL序列容器&#xff1a;vector、string、deque、list标准STL关联容器&#xff1a;set、multiset、map、multimap非标准STL容器&#xff1a…...

网站建设的规划方案/永久免费自助建站系统

菱形 程序…………………… #include<stdio.h> int main() {int i,j,k; printf("\n\n");for(i1;i<4;i) //从第一行到第四行 {for(j1;j<16-i;j) //第一行15个空格 printf(" ");for(k1;k<2*i-1;k)printf("*"); //也可将 * …...

网站设计 线框图/网站广告费一般多少钱

一、配置文件 spring配置文件可以通过如下例子进行拆分使配置文件只在某一种环境下适用。任何Component or Configuration被Profile修饰的都会在加载的时候被限制&#xff0c;比如下面的例子&#xff1a; Configuration Profile("production") public class Producti…...

日本韩国出线了吗/宁波seo推广推荐公司

SPRING循环依赖(circular reference)的解决方法参考文章&#xff1a; &#xff08;1&#xff09;SPRING循环依赖(circular reference)的解决方法 &#xff08;2&#xff09;https://www.cnblogs.com/IcreamPrince/p/4040995.html 备忘一下。...

网站制作专业吗/常州网站推广

知识点&#xff1a;string删除最后一个元素也可以用pop_back&#xff08;&#xff09;来实现 还有就是这一段得写在if内&#xff0c;当时sb了思考了一下才明白233 class Solution { public:vector<string>res;void gene(int n,int lc,int rc,string s){if(lcrc&&…...

网站建设服务标语/微信引流推广怎么做

1. tortoiseSVN 关于 tortoiseSVN 的安装使用详见博文 TortoiseSVN的安装及其简单使用。 2. VisualSVN Server 关于 VisualSVN Server 的安装使用详见博文 VisualSVN-Server服务器的搭建。 或参考 VisualSVN Server的配置和使用方法&#xff08;转&#xff09; 。 另外需要说明…...