统一异常处理的核心目标是让异常在合适位置被捕获、分类、转换并返回友好响应,需区分业务、系统、参数校验异常,通过@ControllerAdvice+@ExceptionHandler实现分层处理,定义三级异常体系与标准Result返回体,避免静默吞异常、错误覆盖及异步失效等问题。
不是把所有异常都吞掉,而是让异常在合适的位置被捕获、分类、转换,并返回对前端友好的结构化响应。关键在于区分业务异常、系统异常和参数校验异常,各自走不同的处理路径,避免堆栈信息泄露,同时保留足够的排查线索。
这是 Spring Boot 中最常用且推荐的方式。通过自定义一个全局异常处理器类,用 @ControllerAdvice 标记,再为不同异常类型编写带 @ExceptionHandler 的方法:
建议定义三级异常体系:ParamException(参数类)、BusinessException(业务规则类)、SystemException(运行时/IO/第三方调用类)。对应统一返回对象如 Result
统一异常处理容易踩坑,几个关键点要特别注意:
参数不能只写 Exception,否则会覆盖更具体的异常处理器;优先按子类声明对于需要统一记录耗时、入参、异常场景的方法,可用 @Around 切面,在 catch 块中识别异常类型后主动触发事件或调用异常处理服务,实现比 @ExceptionHandler 更灵活的上下文控制(比如根据方法注解决定是否告警、是否重试)。