技术分享 | Spring Boot 异常处理

Java 异常类

首先让我们简单了解或重新学习下 Java 的异常机制。

Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类,所有的异常类都是 Object 对象。

Error 是不可捕捉的异常,通俗的说就是由于 Java 内部 JVM 引起的不可预见的异常, Java 虚拟机会选择终止线程。如 OutOfMemoryError ,就是 Java 虚拟机运行过程中出现内存资源错误抛出的。

Excetpion 异常是程序本身引起的,它又分为运行时异常 RuntimeException,和非运行时(编译时)IOException 等异常。如除数为零时引发的 ArrayIndexOutOfBoundException 异常就是运行时异常。非运行异常都是可查可捕捉的。Java 编译器会告诉程序他错了,错在哪里,正确的建议什么。我们可以通过 throws 配合 try-catch 来处理。

Java 异常处理机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含异常类型和出现异常时的程序运行时信息。运行时系统负责寻找处置异常的代码并执行。

捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(Exception Handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。

当异常处理器能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。

当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着 Java 程序的终止。

Spring Boot 异常处理

Spring Boot 的所有异常处理都基于 java 的。

在 Spring Boot 应用程序中,通常统一处理异常的方法有 使用注解处理 RestControllerAdvice

本示例主要目的处理我们日常 Spring Boot 中的异常处理

在 Web 项目中通过 ControllerAdvice、RestControllerAdvice 实现全局异常处理

ControllerAdvice 和 RestControllerAdvice 的区别 相当于 Controller 和 RestController 的区别。

代码示例

GlobalExceptionHandler.javaimport org.springframework.http.HttpStatus;

import org.springframework.web.bind.annotation.*;

import java.util.HashMap;

import java.util.Map;

@RestControllerAdvice

public class GlobalExceptionHandler {

python 复制代码
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({Exception.class})
public Object exceptionHandler(Exception e){
    Map<String,Object> map=new HashMap<>();
    map.put("status",-1);
    map.put("msg",e.getLocalizedMessage());
    return map;
}

}

配置介绍

RestControllerAdvice:全局捕获异常,异常集中处理,更好的使业务逻辑与异常处理剥离开,定义在类上

ExceptionHandler:统一处理某一类异常,声明该方法用于捕获 value 所指的类型的异常(注意:当该异常的子父类都被声明时,按照先子后父的顺序进行捕获)

ResponseStatus:将某种异常映射为 HTTP 状态码,可用在方法上,也可以用在类上(自定义运行时异常类)。

HogwartsTestUserController.java

在 HogwartsTestUserController.java 新增一个 error 接口

/**

* 模拟抛出异常

* */

@GetMapping("/error")

public Object err(){

throw new RuntimeException("抛出一个异常");

}

GET http://127.0.0.1:8081/api/user/users/3 正常返回

{

"id": 3,

"name": "HogwartsTest2",

"pwd": "HogwartsTest2"

}

GET http://127.0.0.1:8081/api/user/error 抛出异常,并给出提示信息

{ "msg": "抛出一个异常", "status": -1 }

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
用户8181870627463 分钟前
第25章 Redis集群脑裂实录:一次真实故障复盘
java·后端
呃呃呃呃ex9 分钟前
2026年古法编程的末法时代,如何评估自己完成迅速转行
前端·后端
EatFan11 分钟前
从单体到模块化:我的 Spring Boot 项目为什么拆成 framework、module、server?
java·spring boot·后端
回家路上绕了弯17 分钟前
Codex 与 ZCode 有什么区别?从开发工作流看 AI 编程工具怎么选
后端
Java内核笔记20 分钟前
Spring Boot 4 可观测性源码剖析:OpenTelemetry 全链路打通日志、指标、追踪
java·后端
杨女士YRJ22 分钟前
python+pytest+01
python·pytest
学渣超23 分钟前
从一次早高峰数据库告警说起:你真的理解缓存该如何落地应用吗?
redis·后端·架构
中趴菜28 分钟前
接口返回的JSON为什么有反斜杠
后端
鸽芷咕29 分钟前
Mu Editor 鸿蒙 PC 适配全记录:用 Qt 与嵌入式 CPython 重建教学型 Python IDE
python·qt·harmonyos