技术分享 | Spring Boot 异常处理

简介: - Java 异常类首先让我们简单了解或重新学习下 Java 的异常机制。Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类,所有的异常类都是 Object 对象。Error 是不可捕捉的异常,通俗的说就是由于 Java 内部 JVM 引起的不可预见的异常, Java 虚拟机会选择终止线程。如 OutOfMemoryError ,就是 Jav
  • 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.java
  • import org.springframework.http.HttpStatus;
  • import org.springframework.web.bind.annotation.*;
  • import java.util.HashMap;
  • import java.util.Map;
  • @RestControllerAdvice
  • public class GlobalExceptionHandler {
  • @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 }
- 

- 
[原文链接](https://mp.weixin.qq.com/s?__biz=MzU3NDM4ODEzMg==&mid=2247500522&idx=1&sn=3fe58b886a022d29c83948225be8be5e&chksm=fd31a021ca4629371522e95be72a59af8880289967d8a9789c0dd325e01ba41aabfdf1f4ea21#rd) 
- 
相关文章
|
监控 Java 应用服务中间件
谈谈你对spring boot 3.0的理解
1. Java 版本要求:Spring Boot 3.0 要求使用 Java 17 或更高版本,这可能会对一些仍在使用旧版 Java 的项目造成兼容性问题。需要确保项目使用的 Java 版本符合要求,并考虑是否需要升级 JDK 版本。 2. 底层依赖项迁移:Spring Boot 3.0 将所有底层依赖项从 Java EE 迁移到了 Jakarta EE API,基于 Jakarta EE 9 并尽可能地兼容 Jakarta EE 10。这可能会对一些使用了 Java EE 的应用造成影响,需要进行相应的修改和调整。 3. 插件和库的支持:尽管 Spring Boot 3.0 支持更多的插件和
530 0
|
9月前
|
Dubbo Java 应用服务中间件
微服务框架(十四)Spring Boot @ControllerAdvice异常处理
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Spring Boot使用@ControllerAdvice进行自定义异常捕捉
|
3月前
|
开发框架 Java UED
如何使用 Spring Boot 实现异常处理
如何使用 Spring Boot 实现异常处理
73 2
|
4月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
41 1
|
4月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
65 0
|
消息中间件 Java 开发者
谈谈你对Spring的理解
Spring是一个用于开发Java应用程序的工具集合,它提供了许多方便的组件和工具,可以帮助开发者更轻松地构建企业级应用程序。 2. Spring Framework是Spring的核心部分,它可以帮助开发者简化代码,提高开发效率。比如,它提供了一种叫做IoC容器的机制,可以自动管理对象的创建和依赖关系。 3. Spring Boot是Spring Framework的扩展,它旨在让开发者更快速地创建Java Web应用程序。相比于传统的开发方式,Spring Boot可以省去繁琐的配置过程,使得开发更加简单和高效。 4. Spring Cloud是为构建云原生应用而设计的工具集合,它
160 2
|
9月前
|
Java 编译器 API
Spring Boot 异常处理
Java异常分为 Throwable 类的两个子类:Error 和 Exception。Error 是不可捕获的,由JVM处理并可能导致程序终止,如 OutOfMemoryError。Exception 是可捕获的,包括运行时异常如 ArrayIndexOutOfBoundsException 和编译时异常如 IOException。
|
9月前
|
Java 数据库连接 数据库
Spring Boot的事务管理实战(附源码 超详细)
Spring Boot的事务管理实战(附源码 超详细)
220 0
|
安全 Java 开发者
谈谈你对Spring6.0的理解
Spring 6.0是Spring框架的一个重要版本,它提供了许多新特性和改进,以帮助开发者更高效地完成工作。以下是我对Spring 6.0的一些理解: 反应式编程支持:Spring 6.0对反应式编程提供了全面的支持,包括支持响应式Web框架、响应式数据存储和反应式安全。这些改进使得开发者能够更加方便地开发高并发、低延迟的应用程序。
224 2
|
XML 存储 前端开发
Spring Boot:从入门到实践的全面指南(1)
1. Spring Boot简介及特性 1.1 简介:什么是Spring Boot Spring Boot 是一个基于 Spring 框架的开源项目,它的主要设计目标是使开发者能够快速启动和部署 Spring 应用程序。Spring Boot 对 Spring 平台和第三方库采用了"习惯优于配置"的理念,减少了开发人员对配置的需求。
2908 1