Java自定义异常处理:优先级高于全局异常处理
Java自定义异常处理:优先级高于全局异常处理
在Spring Boot应用中,我们可以使用@ControllerAdvice和@ExceptionHandler注解来实现全局和自定义的异常处理机制。当自定义异常与全局异常处理同时存在时,可以通过以下步骤确保优先触发自定义异常处理:
**1. 创建全局异常处理类:**java@ControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { // 处理其他异常,返回自定义的错误信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body('Internal Server Error'); }}
这个GlobalExceptionHandler类使用@ControllerAdvice注解标识为全局异常处理器,它会处理所有未被其他更具体的异常处理器处理的异常。
**2. 创建自定义异常类:**javapublic class MyException extends RuntimeException {
public MyException(String message) { super(message); }}
这里我们定义了一个名为MyException的自定义异常类,继承自RuntimeException。
**3. 创建自定义异常处理类:**java@ControllerAdvicepublic class MyExceptionHandler {
@ExceptionHandler(MyException.class) public ResponseEntity<String> handleMyException(MyException e) { // 处理自定义异常,返回自定义的错误信息 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body('Bad Request: ' + e.getMessage()); }}
MyExceptionHandler类也使用@ControllerAdvice注解,但它包含一个使用@ExceptionHandler(MyException.class)注解标识的方法。这表明该方法专门用于处理MyException类型的异常。
**4. 在控制器中抛出自定义异常:**java@RestControllerpublic class HelloController {
@GetMapping('/hello') public String hello() { throw new MyException('Something went wrong'); }}
在HelloController中,我们模拟了在/hello路径下抛出一个MyException异常。
**5. 激活全局异常处理器:**java@EnableWebMvc@SpringBootApplicationpublic class Application {
public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
在启动类上添加@EnableWebMvc注解以启用Spring MVC,并确保全局异常处理器生效。
现在,当访问/hello路径时,由于抛出了MyException,程序会优先匹配到MyExceptionHandler中的handleMyException方法,并返回'Bad Request'错误信息。其他未定义的异常则会被GlobalExceptionHandler中的handleException方法捕获处理。
总结:
通过创建自定义异常类和对应的异常处理类,并使用@ExceptionHandler注解进行关联,我们可以实现更灵活、更精准的异常处理机制。同时,Spring Boot的全局异常处理机制为我们提供了一个处理所有未捕获异常的安全网。
原文地址: https://www.cveoy.top/t/topic/b7Hq 著作权归作者所有。请勿转载和采集!