返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何在Spring Boot中进行异常处理
  • 444
分享到

如何在Spring Boot中进行异常处理

2024-04-02 19:04:59 444人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关如何在Spring Boot中进行异常处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过这篇文章,可以搞懂如何在 sprin

这篇文章将为大家详细讲解有关如何在Spring Boot中进行异常处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

通过这篇文章,可以搞懂如何在 spring Boot  中进行异常处理。但是,光是会用了还不行,我们还要思考如何把异常处理这部分的代码写的稍微优雅一点。下面我会以我在工作中学到的一点实际项目中异常处理的方式,来说说我觉得稍微优雅点的异常处理解决方案。

下面仅仅是我作为一个我个人的角度来看的,如果各位读者有更好的解决方案或者觉得本文提出的方案还有优化的余地的话,欢迎在评论区评论。

最终效果展示

下面先来展示一下完成后的效果,当我们定义的异常被系统捕捉后返回给客户端的信息是这样的:

如何在Spring Boot中进行异常处理

效果展示

返回的信息包含了异常下面 5 部分内容:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 唯一标示异常的 code

  3. Http 状态码

  4. 错误路径

  5. 发生错误的时间戳

  6. 错误的具体信息

这样返回异常信息,更利于我们前端根据异常信息做出相应的表现。

异常处理核心代码

ErrorCode.java (此枚举类中包含了异常的唯一标识、HTTP 状态码以及错误信息)

这个类的主要作用就是统一管理系统中可能出现的异常,比较清晰明了。但是,可能出现的问题是当系统过于复杂,出现的异常过多之后,这个类会比较庞大。有一种解决办法:将多种相似的异常统一为一个,比如将用户找不到异常和订单信息未找到的异常都统一为“未找到该资源”这一种异常,然后前端再对相应的情况做详细处理(我个人的一种处理方法,不敢保证是比较好的一种做法)。

import org.springframework.http.httpstatus;   public enum ErrorCode {      RESOURCE_NOT_FOUND(1001, HttpStatus.NOT_FOUND, "未找到该资源"),     REQUEST_VALIDATioN_FaiLED(1002, HttpStatus.BAD_REQUEST, "请求数据格式验证失败");     private final int code;      private final HttpStatus status;      private final String message;      ErrorCode(int code, HttpStatus status, String message) {         this.code = code;         this.status = status;         this.message = message;     }      public int getCode() {         return code;     }      public HttpStatus getStatus() {         return status;     }      public String getMessage() {         return message;     }      @Override     public String toString() {         return "ErrorCode{" +                 "code=" + code +                 ", status=" + status +                 ", message='" + message + '\'' +                 '}';     } }

ErrorReponse.java(返回给客户端具体的异常对象)

这个类作为异常信息返回给客户端,里面包括了当出现异常时我们想要返回给客户端的所有信息。

import org.springframework.util.ObjectUtils;  import java.time.Instant; import java.util.HashMap; import java.util.Map;  public class ErrorReponse {     private int code;     private int status;     private String message;     private String path;     private Instant timestamp;     private HashMap<String, Object> data = new HashMap<String, Object>();      public ErrorReponse() {     }      public ErrorReponse(BaseException ex, String path) {         this(ex.getError().getCode(), ex.getError().getStatus().value(), ex.getError().getMessage(), path, ex.getData());     }      public ErrorReponse(int code, int status, String message, String path, Map<String, Object> data) {         this.code = code;         this.status = status;         this.message = message;         this.path = path;         this.timestamp = Instant.now();         if (!ObjectUtils.isEmpty(data)) {             this.data.putAll(data);         }     }  // 省略 getter/setter 方法      @Override     public String toString() {         return "ErrorReponse{" +                 "code=" + code +                 ", status=" + status +                 ", message='" + message + '\'' +                 ", path='" + path + '\'' +                 ", timestamp=" + timestamp +                 ", data=" + data +                 '}';     } }

BaseException.java(继承自 RuntimeException 的抽象类,可以看做系统中其他异常类的父类)

系统中的异常类都要继承自这个类。

public abstract class BaseException extends RuntimeException {     private final ErrorCode error;     private final HashMap<String, Object> data = new HashMap<>();      public BaseException(ErrorCode error, Map<String, Object> data) {         super(error.getMessage());         this.error = error;         if (!ObjectUtils.isEmpty(data)) {             this.data.putAll(data);         }     }      protected BaseException(ErrorCode error, Map<String, Object> data, Throwable cause) {         super(error.getMessage(), cause);         this.error = error;         if (!ObjectUtils.isEmpty(data)) {             this.data.putAll(data);         }     }      public ErrorCode getError() {         return error;     }      public Map<String, Object> getData() {         return data;     }  }

ResourceNotFoundException.java (自定义异常)

可以看出通过继承 BaseException 类我们自定义异常会变的非常简单!

import java.util.Map;  public class ResourceNotFoundException extends BaseException {      public ResourceNotFoundException(Map<String, Object> data) {         super(ErrorCode.RESOURCE_NOT_FOUND, data);     } }

GlobalExceptionHandler.java(全局异常捕获)

我们定义了两个异常捕获方法。

这里再说明一下,实际上这个类只需要 handleAppException() 这一个方法就够了,因为它是本系统所有异常的父类。只要是抛出了继承  BaseException 类的异常后都会在这里被处理。

import com.twuc.WEBApp.web.ExceptionController; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;  @ControllerAdvice(assignableTypes = {ExceptionController.class}) @ResponseBody public class GlobalExceptionHandler {      // 也可以将 BaseException 换为 RuntimeException     // 因为 RuntimeException 是 BaseException 的父类     @ExceptionHandler(BaseException.class)     public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) {         ErrorReponse representation = new ErrorReponse(ex, request.getRequestURI());         return new ResponseEntity<>(representation, new HttpHeaders(), ex.getError().getStatus());     }      @ExceptionHandler(value = ResourceNotFoundException.class)     public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {         ErrorReponse errorReponse = new ErrorReponse(ex, request.getRequestURI());         return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorReponse);     } }

(重要)一点扩展:

哈哈!实际上我多加了一个算是多余的异常捕获方法handleResourceNotFoundException() 主要是为了考考大家当我们抛出了  ResourceNotFoundException异常会被下面哪一个方法捕获呢?

答案:

会被handleResourceNotFoundException()方法捕获。因为 @ExceptionHandler  捕获异常的过程中,会优先找到最匹配的。

下面通过源码简单分析一下:

ExceptionHandlerMethodResolver.java中getMappedMethod决定了具体被哪个方法处理。

@Nullable     private Method getMappedMethod(Class<? extends Throwable> exceptionType) {         List<Class<? extends Throwable>> matches = new ArrayList<>();     //找到可以处理的所有异常信息。mappedMethods 中存放了异常和处理异常的方法的对应关系         for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {             if (mappedException.isAssignableFrom(exceptionType)) {                 matches.add(mappedException);             }         }     // 不为空说明有方法处理异常         if (!matches.isEmpty()) {       // 按照匹配程度从小到大排序             matches.sort(new ExceptionDepthComparator(exceptionType));       // 返回处理异常的方法             return this.mappedMethods.get(matches.get(0));         }         else {             return null;         }     }

从源代码看出:getMappedMethod()会首先找到可以匹配处理异常的所有方法信息,然后对其进行从小到大的排序,最后取最小的那一个匹配的方法(即匹配度最高的那个)。

写一个抛出异常的类测试

Person.java

public class Person {     private Long id;     private String name;      // 省略 getter/setter 方法 }

ExceptionController.java(抛出一场的类)

@RestController @RequestMapping("/api") public class ExceptionController {      @GetMapping("/resourceNotFound")     public void throwException() {         Person p=new Person(1L,"SnailClimb");         throw new ResourceNotFoundException(ImmutableMap.of("person id:", p.getId()));     }  }

关于如何在Spring Boot中进行异常处理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何在Spring Boot中进行异常处理

本文链接: https://lsjlt.com/news/84582.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在Spring Boot中进行异常处理
    这篇文章将为大家详细讲解有关如何在Spring Boot中进行异常处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过这篇文章,可以搞懂如何在 Sprin...
    99+
    2024-04-02
  • Spring Boot中怎么对异常进行处理
    今天就跟大家聊聊有关Spring Boot中怎么对异常进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。先谈谈“异常处理”这件事。下面有 2 份伪代码,对比下:// ① 基于 i...
    99+
    2023-05-31
    spring boot 进行处理 spring boo
  • 使用spring boot如何对异常请求进行处理
    这期内容当中小编将会给大家带来有关使用spring boot如何对异常请求进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。404异常处理:@Controllerpublic class&n...
    99+
    2023-05-31
    springboot 进行处理
  • 如何在Python中进行异常处理
    目录一、抛出异常和自定义异常1、raise语句2、自定义异常类型二、捕捉异常1、捕捉多个异常2、获取异常信息三、finally子句一、抛出异常和自定义异常 Python中使用用异常对...
    99+
    2024-04-02
  • Spring Boot如何统一处理全局异常
    这篇文章给大家分享的是有关Spring Boot如何统一处理全局异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。注解的介绍@ControllerAdvice@ControllerAdvice注解是Sp...
    99+
    2023-06-22
  • lombok如何在Spring Boot中进行安装
    lombok如何在Spring Boot中进行安装?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. LombokLombok想要解决了的是在我们实体Bean中大量的Get...
    99+
    2023-05-31
    springboot spring boo lombok
  • Spring Boot 中自定义异常怎么处理
    这篇文章将为大家详细讲解有关Spring Boot 中自定义异常怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @Co...
    99+
    2023-06-02
  • 如何在Python中使用Selenium对异常进行处理
    这篇文章主要介绍了如何在Python中使用Selenium对异常进行处理,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对...
    99+
    2023-06-06
  • Spring Boot全局异常处理解析
    本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下1、后台处理异常a、引入thymeleaf依赖<!-- thymeleaf模板插件 --><dependency> <groupId&...
    99+
    2023-05-31
    spring boot 异常处理
  • SpringBoot中如何进行统一异常处理
    目录1、处理前2、进行系统异常全局处理3、进行自定义异常处理总结如何在SpringBoot项目里进行统一异常处理 需要了解的知识 @ControllerAdvice的作用 1、处理前...
    99+
    2024-04-02
  • CLI如何在Spring Boot进行安装
    本篇文章为大家展示了CLI如何在Spring Boot进行安装,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring Boot是一个命令行工具,用于使用Spring进行快速原型搭建。它允许你运行...
    99+
    2023-05-31
    springboot spring boo cli
  • Spring Boot全局统一异常处理器
    目录一、封装统一返回结果类二、自定义异常封装类三、错误枚举四、全局异常处理类五、测试一、封装统一返回结果类 import com.jiusen.exercise.enums.Er...
    99+
    2024-04-02
  • Vue3如何进行全局异常处理
    本篇内容主要讲解“Vue3如何进行全局异常处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3如何进行全局异常处理”吧!在开发组件库或者插件,经常会需要进行全局异常处理,从而实现:全局统一...
    99+
    2023-06-29
  • PHP如何在Yii框架中进行错误和异常处理
    这篇文章主要讲解了“PHP如何在Yii框架中进行错误和异常处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP如何在Yii框架中进行错误和异常处理”吧!Yii已经默认已经在CApplic...
    99+
    2023-06-20
  • 如何在SpringBoot项目里进行统一异常处理
    目录1、处理前2、进行系统异常全局处理3、进行自定义异常处理效果前言: 需要了解的知识: @ControllerAdvice的作用 1、处理前 异常代码: @ApiOperatio...
    99+
    2024-04-02
  • spring boot如何进行监控
    这篇文章将为大家详细讲解有关spring boot如何进行监控,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、指标监控引入jar包:<dependency>   ...
    99+
    2023-06-25
  • 如何进行C++代码的异常处理?
    如何进行C++代码的异常处理引言:在编写C++代码时,异常处理是非常重要的一部分。异常处理机制可以帮助我们在程序运行时捕获和处理错误。在本文中,我们将讨论一些关于如何在C++中进行异常处理的重要概念和技巧。一、异常处理的基本概念异常处理是一...
    99+
    2023-11-02
    代码 C++ 异常处理
  • C++ 函数库如何进行异常处理?
    c++++ 函数库异常处理通过 try-catch 语句实现,可捕获异常类型并进行处理。常见异常类型包括逻辑错误、运行时错误、内存分配失败、类型转换失败、索引超范围。实战案例演示了文件读...
    99+
    2024-04-18
    c++ 异常处理 标准库
  • 如何在 Goroutine 中处理异常?
    在 goroutine 中处理异常:使用 recover 从恢复点获取异常。在 defer 语句内处理异常,例如打印友好的 errormessage。实战案例:异步检查用户访问权限并捕获...
    99+
    2024-05-15
    go 异常处理 access
  • 怎么在Java项目中对异常进行处理
    本文章向大家介绍怎么在Java项目中对异常进行处理的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作