全局异常处理应对外模糊、对内可追踪:前端仅见简洁提示,后端日志完整脱敏记录;统一用@ControllerAdvice+@ExceptionHandler拦截并转换为标准JSON(code/msg/data),屏蔽堆栈、SQL、路径等敏感信息;按场景模糊化错误语义,日志中掩码隐私字段、记录SQL状态码而非消息;前端只解析约定字段msg,不信任error/message或堆栈。

全局异常处理中避免敏感堆栈信息泄漏给前端,核心是“对外模糊、对内可追踪”:前端只看到简洁友好的提示,后端日志完整记录便于排查,两者严格隔离。
统一拦截并替换响应内容
使用 @ControllerAdvice + @ExceptionHandler 拦截所有 Controller 层异常,不返回原始 Exception.getMessage() 或 printStackTrace()。无论抛出什么异常,都转换为标准 JSON 格式,例如:
- 固定字段:
code(业务码)、msg(用户提示)、data(空或 null) - 禁止响应体包含:
stackTrace、cause、className、数据库连接地址、文件路径、SQL 语句等 - 示例错误响应:
{"code":500,"msg":"系统繁忙,请稍后再试","data":null}
区分对待异常类型,屏蔽细节原因
对敏感操作相关异常做语义模糊化处理:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 登录失败 → 不返回 “密码错误” 或 “账号不存在”,统一提示 “用户名或密码不正确”
- 支付失败 → 避免暴露 “余额不足”“银行卡过期”“风控拒绝”,改用 “交易未成功,请检查支付方式”
- 资源不存在 → 不提示 “/admin/config.yml not found”,只说 “请求的服务暂不可用”
日志记录要完整但脱敏
异常在服务端必须被完整记录,但需主动过滤敏感内容:
立即学习“前端免费学习笔记(深入)”;
- 手机号、身份证号、邮箱、token 等字段在写入日志前做掩码(如 138****1234)
- 捕获 SQLException 时,记录
e.getSQLState()和e.getErrorCode(),而非e.getMessage() - 禁用生产环境的 DEBUG/TRACE 日志级别,防止意外输出参数快照或上下文变量
前端不解析原始异常,只信任约定字段
前端 Axios 拦截器中,仅依据后端定义的响应结构提取提示:
- 判断
response.data.code !== 200或response.data.success === false - 优先取
response.data.msg(不是response.data.error或response.data.message),调用ElMessage.error()展示 - 对特定业务码(如
"TOKEN_EXPIRED")做跳转,其余一律走默认轻提示,不尝试解析堆栈或 message 字段

















