报错只看到 RuntimeException 操作失败,真正的 SQL 错误和字段名完全看不到,只能靠猜。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,每一层都 new 一个新异常还没带 cause,原始堆栈被截断,最内层的信息在包装时就丢了。

「异常链丢失」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。

throw new BizException('下单失败', e);
log.error('order fail', e);
while (e.getCause() != null) e = e.getCause();

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,包装异常时把原异常作为 cause 传进去;最外层统一打印完整异常链;不允许吞异常只打一行日志。

最后用这个标准收尾,日志里能看到最内层的 SQLException 和具体字段,定位不用再翻源码。

作者 9823189