总结:
自定义异常类
全局异常处理器@ControllerAdvice + @ExceptionHandler
throw new 自定义异常类
步骤 1:创建自定义异常类
首先,定义一个或多个自定义异常类,以便在应用程序中抛出特定的错误。
public class CustomException extends RuntimeException { public CustomException(String message) { super(message); } }
自定义的异常类要继承RuntimeException
步骤 2:创建全局异常处理器
接下来,创建一个全局异常处理器类,并使用
@ControllerAdvice
注解。这将使该类能够处理所有控制器抛出的异常。使用@ExceptionHandler注意捕获指定的类
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<String> handleCustomException(CustomException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
步骤 3:在控制器中抛出异常
在你的控制器中,你可以根据需要抛出自定义异常。这样,全局异常处理器就会捕获到这些异常
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/myerror")
public String throwError() {
throw new CustomException("This is a custom error!");
}
}
注意:这里路径不要用/error,因为 springboot内置了一个/error用于重定向,测试自定义异常的话可能没有效果
步骤 4:(可选)创建自动配置类
如果你希望将全局异常处理器放在一个公共模块(如
common
模块)并能在其他模块中自动使用,可以创建一个自动配置类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CommonAutoConfiguration {
@Bean
public GlobalExceptionHandler globalExceptionHandler() {
return new GlobalExceptionHandler();
}
}
步骤 5:配置 spring.factories
文件
如果你创建了自动配置类,需要在
src/main/resources/META-INF/spring.factories
文件中注册它。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.common.CommonAutoConfiguration
步骤 6:在其他模块中添加依赖
确保其他模块在其构建配置中添加对
common
模块的依赖,这样它们就能自动使用全局异常处理器。
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
步骤 7:测试异常处理
启动你的应用程序并访问 /error
路径,验证是否能正确捕获并处理抛出的异常,返回相应的错误信息。
补充
我们可以定义多个异常类 ,将遇到的异常分类,比如已知什么异常或者未知异常
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
public class InvalidInputException extends RuntimeException {
public InvalidInputException(String message) {
super(message);
}
}