Java统一异常处理框架核心是@ControllerAdvice全局捕获+分层RuntimeException体系(BaseException、BusinessException、SystemException、AuthException)+标准Result响应(code/msg/data)+AOP日志脱敏,确保语义清晰、错误可控、日志可溯。
Java中实现统一异常处理框架,核心是将异常的捕获、分类、转换与响应封装成可复用、易维护的结构,避免在每个Controller或Service中重复写try-catch,同时保证前后端交互语义清晰、错误信息可控、日志可追溯。
不建议直接抛出Exception或throw new Exception("xxx"),应建立分层异常类: - 自定义基类 BaseException(含code、message、timestamp等通用字段) - 业务异常如 BusinessException(如参数校验失败、余额不足) - 系统异常如 SystemException(如DB连接超时、远程调用失败) - 权限异常如 AuthException(用于统一拦截未登录/无权限)
所有自定义异常均继承RuntimeException,避免强制try-catch干扰业务主流程;构造时支持链式传参,例如:
new BusinessException(ErrorCode.USER_NOT_FOUND, "用户ID %d 不存在", userId)创建一个配置类(如GlobalExceptionHandler),用@ControllerAdvice声明为全局异常处理器,再通过@ExceptionHandler指定处理哪些异常类型:
注意:不同异常对应不同HTTP状态码(如400对应参数异常,401对应认证失败,403对应权限拒绝,500对应服务异常)。
异常发生时,仅打印堆栈不够——需记录请求上下文(URL、method、入参、用户ID、traceId)便于排查。可用@Around切面在异常抛出后执行日志记录逻辑:
日志中避免打印完整request body或stack trace到前端响应体,防止信息泄露。
统一返回类(如Result
code必须全局唯一且含义明确,禁止用“0”表示失败、“1”表示成功这类模糊设计;msg由后端拼装完成,不依赖前端翻译,也不含变量占位符(如"{name}不存在" → "张三不存在")。