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,触发自定义异常 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机-ARM】

计算机-ARM ■ 指令集■ 1. RISC■ 2. CISC ■ ARM简介■ 1.■ 2. ■ ARM-CPU体系架构■ 1. M0■ 2. M3■ 3. M4■ 4. M7■ 5. M7■ 6. M7 ■ ARM-寄存器■ 1. 通用寄存器■ 2.■ 3.■ 4. ■ ARM-工作模式■ ARM-寄存器组■ ARM-异常向量表■ 由于soc0x00000000 是存放IROM芯片…

基于.NetCore和ABP.VNext的项目实战七:全局异常处理并日志记录

ABP框架已经默认为我们实现了全局的异常模块,这里我们自定义全局异常模块,先在HelloWorldController中写一个异常接口,测试下ABP的默认全局异常: [HttpGet][Route("Exception")]public string Exception(){throw new NotImplementedException("这是一个未实…

常用技巧-PPT时你真的做对了吗?

常用技巧-PPT时你真的做对了吗&#xff1f; PPT时通常会通过多种表现手法将信息转化为图表&#xff0c;更好的凸显自己的专业素养。将数据转化为图表是对的&#xff0c;那么你真的用对了图表了吗&#xff1f; 话不多说&#xff0c;直接上干货&#xff1a; 时间线图 时间线是…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

突破性技术: 大语言模型LLM量化激活outliers异常值抑制

LLM过去有两种突破性技术大大提升了量化精度&#xff0c;分别是group-wise量化和GPTQ/AWQ量化。前者相比于过去的per-tensor和per-channel/per-axis量化提出了更细粒度的对channel拆分为更小单元的量化方式&#xff0c;后者通过巧妙的算法明显提升了4bit量化的精度。 LLM量化存…

【面试八股总结】MySQL索引(二):B+树数据结构、索引使用场景、索引优化、索引失效

参考资料&#xff1a;小林coding、阿秀 一、为什么InnoDB采用B树作为索引数据结构&#xff1f; B 树是一个自平衡多路搜索树&#xff0c;每一个节点最多可以包括 M 个子节点&#xff0c;M 称为 B 树的阶&#xff0c;所以 B 树就是一个多叉树。 B 树与 B 树的差异&#xff1a;…

【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成

为了快速上手UE5&#xff0c;开启了《复刻刺客信条动态地面》的技术篇章&#xff0c;最终希望复刻刺客信条等待界面的效果&#xff0c;这个效果大体上包括&#xff1a; 基础的地面随着任务走动消失和出现的基础效果地板的Bloom和竖起的面片辉光效果 既然是新手&#xff0c;&am…

CSS学习笔记之高级教程(五)

23、CSS 媒体查询 - 实例 /* 如果屏幕尺寸超过 600 像素&#xff0c;把 <div> 的字体大小设置为 80 像素 */ media screen and (min-width: 600px) {div.example {font-size: 80px;} }/* 如果屏幕大小为 600px 或更小&#xff0c;把 <div> 的字体大小设置为 30px …

器利而事善——datagrip 的安装以及简单使用

一&#xff0c;安装 下载&#xff1a;直接到官网下载即可&#xff0c; 破解&#xff1a;这是破解连接&#xff1a;https://pan.baidu.com/s/11BgOMp4Z9ddBrXwCVhwBng &#xff0c;提取码&#xff1a;abcd&#xff1b; 下载后&#xff0c;选择倒数第三个文件&#xff0c;打开da…

【ZZULI数据结构实验四】:C语言排序算法大比拼

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

洛谷 P10566 「Daily OI Round 4」Analysis 题解

先弄个 ASCII 码表&#xff1a; 分析 很明显&#xff0c;想要节省时间&#xff0c;就要把这些字符转换成和它们的 ASCII 值最接近的大写字母。 通过 ASCII 码表&#xff0c;很容易就可以发现&#xff1a; ASCII 值与数字最接近的大写字母是 A \texttt A A。ASCII 值与小写…

切片的MBTiles格式和XYZ格式

MBTiles 和XYZ是两种经常使用的切片格式&#xff0c;尤其是各类下载器下载在线地图时经常使用这种格式。 MBTiles 是一种用于存储地图切片&#xff08;tileset&#xff09;的文件格式&#xff0c;通常用于地图的存储和传输。该格式由 Mapbox 开发&#xff0c;旨在简化大规模栅格…

TensorFlow库详解:Python中的深度学习框架

引言 TensorFlow是由Google Brain团队开发的开源机器学习库&#xff0c;用于各种复杂的数学计算&#xff0c;特别是涉及深度学习的计算。它提供了大量工具和资源&#xff0c;用于构建和训练机器学习模型。TensorFlow因其强大的功能和灵活性&#xff0c;在机器学习和深度学习领…

IGraph使用实例——贝尔曼-福特算法(求解单源最短路径)

1 概述 本文中求解最短路径使用的方法是igraph中基于贝尔曼-福特算法&#xff08;Bellman-Ford算法&#xff09;。Bellman-Ford算法是一种用于在加权图中找到从单个源点到所有其他顶点的最短路径的算法。这个算法可以处理包含负权重边的图&#xff0c;但不能处理有负权重循环的…

CTFHUB-技能树-web-web前置技能-HTTP协议全

目录 1.请求方式 2.302跳转 3.Cookie 4.基础认证 5.响应包源码 1.请求方式 curl -v -X http://challenge-3022c877a8dcedeb.sandbox.ctfhub.com:10800/index.php 2.302跳转 参考链接&#xff1a;http://t.csdnimg.cn/aqdNG 301——永久性重定向。该状态码表示请求的资源已…

Springboot vue elementui 前后端分离 事故灾害案例管理系统

源码链接 系统演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

构造,CF862C. Mahmoud and Ehab and the xor

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 862C - Codeforces 二、解题报告 1、思路分析 非常松的一道构造题目 我们只需让最终的异或和为x即可 下面给出个人一种构造方式&#xff1a; 先选1~N-3&#xff0c;然后令o (1 << 17) …

树莓集团领航:园区运营新标杆

在当今经济飞速发展的时代&#xff0c;产业园区作为推动地方经济增长、优化产业布局的重要平台&#xff0c;其运营和管理水平至关重要。树莓集团&#xff0c;作为园区运营的政企典范&#xff0c;凭借其专业的运营能力和卓越的服务品质&#xff0c;赢得了业界的广泛赞誉。 树莓…

大模型 vs 数据资产,谁才是真正的BOSS?

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数字化时代的浪潮中&#xff0c;数据资产管理已成为企业战略中不可或缺的一环。随着数据量的激增&#xff0c;如何有效管理、利用这些数据&#xff0c;提炼其价值&#xff0c;成为了摆在每个组织面前的重大挑战。在这个背景下…

dataframe元组和字典操作

这是一个测试文件&#xff0c;今天发现一些有意思的语法&#xff0c; 首先字典是可以加入元组的 AA {"a":2,"b":23,"c":(1,2,3)} print(AA)结果如下 example1 import pandas as pd data pd.DataFrame(data {"a":(-1,-2,-3),&quo…