第一眼:错误是什么?
找异常类型、错误码和消息,例如 NullPointerException、ECONNREFUSED、context deadline exceeded。
适用于 Python / Go / Java / TypeScript。核心不是从头读到尾,而是回答四个问题:什么错、在哪炸、怎么走到这里、谁才是根因。
找异常类型、错误码和消息,例如 NullPointerException、ECONNREFUSED、context deadline exceeded。
跳过框架噪音,找包名/目录属于项目的第一帧;它通常是最值得打断点的位置。
沿调用帧还原输入如何流动;确认错误是本地触发,还是下游包装后冒泡。
关联请求 ID、时间、参数摘要、部署版本和上下游日志,不要只凭最后一行猜。
During handling... / direct cause:有多段因果链。raise ... from e 能保留真正 cause。goroutine N [state]。error 默认没有栈;用 %w 包装并在边界记录。Caused by 一路读到最底。... N common frames omitted 是重复帧压缩,不是信息丢失。Suppressed:资源关闭等次要异常。文件:行:列;列号定位表达式很有用。async 栈可能跨 Promise;留意 processTicks... 边界。Error(..., { cause }) 保留因果,不要只拼接字符串。底层返回并包装,API / Worker 边界统一记录完整异常。层层打印会制造重复告警,也可能泄露数据。
部署版本、符号、source map、镜像标签必须可追溯;否则行号再精确也会指向错误源码。
它可能只是失败被发现的位置。数据早已在上游污染,或下游服务返回了错误;必须看调用上下文。
可预期业务失败应正常返回;异常表示非正常路径;panic / 未捕获异常会终止请求、线程甚至进程。
不要记录密码、Token、完整卡号、身份证或整段请求体。使用字段白名单、掩码和摘要。
缺少 price 导致 None * int。练习从最后一行反查 calculate_total。
解引用空 Customer。练习识别 panic、goroutine 和“两行一帧”的坐标格式。
业务异常包装重复订单错误。练习穿透外层异常,追到最后一个根因。
await 后访问 undefined。练习读取异步帧、行列号并理解 source map。
Makefile 是统一入口,labs/<language>/broken 负责制造错误,fixed 展示修复思路;详细步骤见 README.md。