Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理

Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理

在 Web 应用程序中,异常处理是非常重要的一部分。在 Spring Boot 中,可以使用 @ExceptionHandler 注解来处理控制器中的异常。本文将介绍如何使用 @ExceptionHandler 注解进行局部异常处理,并提供一些示例代码来帮助您更好地理解。

在这里插入图片描述

@ExceptionHandler 注解简介

@ExceptionHandler 注解是 Spring MVC 框架提供的一种异常处理机制。当控制器中抛出指定类型的异常时,Spring MVC 会自动调用使用 @ExceptionHandler 注解标记的方法来处理异常。

例如,以下代码演示了如何使用 @ExceptionHandler 注解来处理 NumberFormatException 异常:

@RestController
public class DemoController {
    
    
    @GetMapping("/test")
    public String test(@RequestParam("number") String number) {
    
    
        Integer.parseInt(number);
        return "success";
    }

    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) {
    
    
        return ResponseEntity.badRequest().body("Invalid number format");
    }
}

在上面的代码中,我们定义了一个名为 DemoController 的控制器,并在其中提供了一个名为 test 的方法,用于将字符串转换为整数。如果字符串格式不正确,则会抛出 NumberFormatException 异常。我们还定义了一个名为 handleNumberFormatException 的方法,并使用 @ExceptionHandler 注解来处理 NumberFormatException 异常。如果控制器中抛出 NumberFormatException 异常,则会调用该方法来处理异常,并返回一个 HTTP 400 错误响应。

局部异常处理

在 Spring Boot 中,可以在控制器的方法上使用 @ExceptionHandler 注解来实现局部异常处理。这意味着您可以为每个方法定义自己的异常处理逻辑。

例如,以下代码演示了如何在控制器的方法上使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常:

@RestController
public class DemoController {
    
    
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
    
    
        User user = userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
        return user;
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
    
    
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

在上面的代码中,我们定义了一个名为 getUser 的方法,并使用 @PathVariable 注解将 URL 中的参数映射到方法的参数中。如果找不到指定 ID 的用户,则会抛出 UserNotFoundException 异常。我们还定义了一个名为 handleUserNotFoundException 的方法,并使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常。如果控制器中抛出 UserNotFoundException 异常,则会调用该方法来处理异常,并返回一个 HTTP 404 错误响应。

总结

在本文中,我们介绍了如何使用 @ExceptionHandler 注解进行局部异常处理,并提供了一些示例代码来帮助您更好地理解。使用 @ExceptionHandler 注解可以为每个方法定义自己的异常处理逻辑,使代码更加清晰和可维护。希望这篇文章对您有所帮助,谢谢阅读!

以下是完整的示例代码:

@RestController
public class DemoController {
    
    
    @GetMapping("/test")
    public String test(@RequestParam("number") String number) {
    
    
        Integer.parseInt(number);
        return "success";
    }

    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) {
    
    
        return ResponseEntity.badRequest().body("Invalid number format");
    }

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
    
    
        User user = userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
        return user;
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
    
    
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
    
    
    public UserNotFoundException(Long id) {
    
    
        super("User not found with id:" + id);
    }
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    
}

猜你喜欢

转载自blog.csdn.net/JasonXu94/article/details/131341962