Spring Boot中是否可全局捕获Error而非Exception用于日志记录?
Spring Boot 用@ControllerAdvice捕获Controller层Error的实现方案
可行性结论
需求完全可行。Spring MVC提供的@ExceptionHandler注解原生支持处理所有Throwable类型的子类,既可以处理Exception,也可以处理Error类型的异常,无需为每个接口方法单独添加try...catch块。
最优实现方案
你可以直接在现有CoreExceptionHandler类的基础上调整,根据业务需求选以下两种方案即可:
方案1:分开处理Exception和Error
适合需要对两类异常做不同逻辑处理的场景:
import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; @ControllerAdvice @Component @Order(value = Ordered.HIGHEST_PRECEDENCE) public class CoreExceptionHandler { @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) public void handleException(Exception ex) { // 原有Exception日志记录逻辑 } @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Error.class) public void handleError(Error error) { // 新增Error日志记录逻辑,比如栈溢出、OOM等严重错误 } }
方案2:统一处理所有Throwable
适合不需要区分异常类型,统一做日志记录的场景:
import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; @ControllerAdvice @Component @Order(value = Ordered.HIGHEST_PRECEDENCE) public class CoreExceptionHandler { @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Throwable.class) public void handleAllThrowable(Throwable throwable) { // 统一记录所有Exception、Error类型的异常日志 } }
注意事项
- 如果你的Controller都是Rest接口,建议把类上的
@ControllerAdvice替换为@RestControllerAdvice,无需额外配置即可返回标准JSON响应。 - 捕获Error后不要做过多复杂业务操作,尤其是OOM这类严重错误,优先保证日志可以正常写入即可,避免加重系统负载。
- 该配置默认对所有Spring管理的Controller生效,如果你需要限定生效范围,可以给
@ControllerAdvice指定basePackages等参数做范围过滤。
内容的提问来源于stack exchange,提问作者sp_artacus_code
相关产品推荐
相关产品推荐

