一次失败请求的日志里有两条 ERROR,堆栈完全一样,只是类名不同,告警系统算成两次故障。乍看像缓存或者权限的锅,追下去往往不是。

catch (IOException e) {
    throw new OrderException("load order failed", e);
}

追下去是这么回事:底层 catch 后打了 error 又把异常抛出去,上层 catch 再打一次。异常没有被包装成新类型,两处打的是同一个对象。

「异常重复打印」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,约定只在能处理异常的那一层打日志;中间层要么包装成业务异常 要么直接往上抛;打日志时带上 layer 字段 便于区分;检查现有 catch 块 删掉只打不处理的那些。

验收就看一点,一次失败只出现一条 ERROR 且只有一份堆栈。

作者 9823189