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

Spring——全局异常处理(介绍@RestControllerAdvice和@ExceptionHandler)

目录

  • 1.@RestControllerAdvice@ExceptionHandler的作用
  • 2.实现原理
  • 3.各种特性

1.@RestControllerAdvice@ExceptionHandler的作用

  1. @RestControllerAdvice注解

@RestControllerAdvice是Spring框架提供的注解,用于全局异常处理。它将异常处理方法集中在一个类中,统一处理项目中的异常情况。

  1. @ExceptionHandler注解

@ExceptionHandler是Spring框架提供的注解,用于处理特定的异常。它标记在方法上,当抛出指定类型的异常时,会调用该方法进行处理。

@RestControllerAdvice注解的代码示例:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        // 处理异常逻辑
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error");
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {
        // 处理用户不存在异常逻辑
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User Not Found");
    }

}

上述代码中,使用@RestControllerAdvice注解标记全局异常处理器类GlobalExceptionHandler。通过@ExceptionHandler注解定义了两个异常处理方法,分别处理通用的Exception异常和自定义的UserNotFoundException异常。在每个方法中,可以编写具体的异常处理逻辑,并返回相应的响应信息给前端。

关于@RestControllerAdvice注解的特性解释:

  1. 统一异常处理:通过@RestControllerAdvice注解,将所有的异常处理方法集中在一个类中,实现统一异常处理。
  2. AOP机制:使用AOP机制,将带有@ExceptionHandler注解的方法与异常的抛出点进行绑定,实现全局异常处理。
  3. 异常类型匹配:根据异常的类型来选择合适的@ExceptionHandler方法进行处理。
  4. 异常处理顺序:多个@ExceptionHandler注解的方法可以处理不同类型的异常,执行顺序是根据异常的继承关系来确定的,从子类异常到父类异常的顺序执行。

关于@ExceptionHandler注解的代码示例:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {
        // 处理用户不存在异常逻辑
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User Not Found");
    }

    @GetMapping("/users/{userId}")
    public ResponseEntity<User> getUserById(@PathVariable("userId") int userId) {
        User user = userService.getUserById(userId);
        if (user == null) {
            throw new UserNotFoundException("User not found");
        }
        return ResponseEntity.ok(user);
    }

}

上述代码中,使用@ExceptionHandler注解定义了一个异常处理方法handleUserNotFoundException,用于处理UserNotFoundException异常。在getUserById方法中,如果根据userId查询不到用户,则抛出UserNotFoundException异常,全局异常处理器会调用handleUserNotFoundException方法进行处理。

关于@ExceptionHandler注解的特性解释:

  1. 异常细粒度处理:根据异常的类型,进行不同的处理。在代码示例中,handleUserNotFoundException方法只处理UserNotFoundException异常。
  2. 自定义异常处理:通过自定义异常类型,我们可以灵活地定义异常处理逻辑,并返回自定义的响应信息给前端。
  3. 异常信息返回:在异常处理方法中,可以根据需要返回不同的响应信息给前端。在代码示例中,handleUserNotFoundException方法返回的响应信息是"User Not Found"。
  4. 异常处理顺序:多个@ExceptionHandler注解的方法可以处理不同类型的异常,执行顺序是根据异常的继承关系来确定的。在代码示例中,如果同时抛出Exception和UserNotFoundException异常,会先执行handleUserNotFoundException方法。

通过以上代码示例和解释,我们可以更加深入地理解@RestControllerAdvice和@ExceptionHandler这两个注解的作用、实现原理和各种特性。在实际项目中,我们可以根据需求,灵活地使用这两个注解来实现全局异常处理,提高系统的稳定性和用户体验。

2.实现原理

  1. @RestControllerAdvice的实现原理

@RestControllerAdvice注解实现全局异常处理的原理是通过AOP(面向切面编程)机制,将带有@ExceptionHandler注解的方法与异常的抛出点进行绑定。当抛出异常时,Spring框架会根据异常的类型,选择合适的@ExceptionHandler方法进行处理。

  1. @ExceptionHandler的实现原理

@ExceptionHandler注解的实现原理是通过定义一个带有@ExceptionHandler注解的方法,在方法中编写异常处理的逻辑。当抛出指定类型的异常时,Spring框架会自动调用该方法进行异常处理。

3.各种特性

  1. 统一异常处理

@RestControllerAdvice注解可以将所有异常处理方法集中在一个类中,实现统一异常处理。它可以捕获项目中所有的异常,从而避免异常信息直接抛给前端,提高系统的稳定性和用户体验。

  1. 异常细粒度处理

@ExceptionHandler注解可以根据异常的类型,进行不同的处理。这使得我们可以根据具体的异常类型,编写相应的处理逻辑,实现异常的细粒度处理。

  1. 自定义异常处理

通过自定义异常类型,并在@ExceptionHandler方法中处理该异常,我们可以根据业务需要,灵活地定义异常处理逻辑,并返回自定义的响应信息给前端。

  1. 异常信息返回

在异常处理方法中,我们可以根据需要返回不同的响应信息给前端,例如错误码、错误信息等。这样,前端可以根据不同的响应信息进行相应的处理和展示。

  1. 异常处理顺序

多个@ExceptionHandler注解的方法可以处理不同类型的异常,但是它们的执行顺序是根据异常的继承关系来确定的。具体规则是从子类异常到父类异常的顺序执行,直到找到合适的异常处理方法。

总结

本文介绍了Java前后端分离项目中Spring全局异常处理器的实现,包括@RestControllerAdvice和@ExceptionHandler这两个注解的作用、实现原理和各种特性。通过使用全局异常处理器,我们能够统一处理项目中的异常情况,提高系统的稳定性和用户体验。同时,我们也了解到了全局异常处理器的灵活性和自定义性,使得我们可以根据业务需要,对不同类型的异常进行细粒度的处理。


http://www.kler.cn/a/158517.html

相关文章:

  • 前端接入Paymax支付请求
  • 学习electron
  • uni-app快速入门(十)--常用内置组件(下)
  • Javaweb梳理17——HTMLCSS简介
  • Java策略模式应用实战
  • VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯
  • js实现AES加密解密,简易又全面
  • monaco报错#Unexpected usage at EditorSimpleWorker.loadForeignModule
  • WPF使用Prism框架批量注册Page,Window,UserControl等视图组件
  • 7天快速学习计算机基础必考八股文day02:操作系统
  • SOCKET、TCP、HTTP之间的区别与联系
  • 最新测试开发招聘信息汇总,内含社招和实习生岗位~
  • 如何有效预防内存泄漏?
  • 基于Python+OpenCV的车道线和车辆检测系统
  • 【c】16进制数转化为10进制数(计算方法在最后,大家也可以上网搜索视频,视频更详细,谢谢)
  • Flink入门之核心概念(三)
  • xcode opencv
  • SR锁存器—>带EN的SR锁存器—>D锁存器—>边沿触发式D触发器—>寄存器
  • NET Core迁移前工作
  • 竞赛选题 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]
  • 瑜伽学习零基础入门,各种瑜伽教学方法全集
  • Android wifi disable分析
  • luceda ipkiss教程 39:修改版图text字体的粗细
  • AI:大语言模型LLM
  • 代码随想录训练营第五十六天583. 两个字符串的删除操作72. 编辑距离
  • 我最喜欢的白版应用,AI加持的新功能开源!强烈推荐