统一异常处理不要吞掉业务语义
统一异常处理不要吞掉业务语义
统一异常处理能让接口返回更稳定,但如果设计粗糙,也会把所有问题都包装成同一种失败。用户看不懂,前端不好处理,后端也不容易排查。
先区分异常类型
业务异常、参数异常、权限异常、系统异常应该有不同语义。业务异常通常可以展示给用户,参数异常提示请求不合法,权限异常说明当前用户不能操作,系统异常则需要隐藏内部细节。
如果所有异常都返回系统繁忙,前端和用户都失去了判断依据。
错误码要稳定
错误码不是随手写的字符串。它应该能稳定表达一类问题,让前端、测试和后端可以用同一种语言沟通。错误文案可以调整,错误码不应该频繁变化。
同时,错误码不宜过细。每个 if 都发明一个错误码,会让维护成本上升。
日志要保留内部细节
返回给用户的信息要克制,但日志里要保留足够上下文。请求标识、用户标识、业务对象、异常栈、关键参数,都能帮助排查。
外部响应和内部日志是两个层次。对用户友好,不代表对开发隐藏线索。
复盘
统一异常处理的目标不是把所有错误变成同一个格式,而是让不同失败保留自己的业务语义。格式统一,语义也要清楚。
参考
- Spring MVC 异常处理文档:https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-exceptionhandler.html
- RFC Problem Details 文档:https://www.rfc-editor.org/rfc/rfc9457.html