先给结论:修复后出现的新异常,多数不是修复本身错了,而是这条提交链上至少有两个环节共用了一个输入或一个触发条件。要拆开它,先把链路画成“谁把URL交给谁、谁决定要不要处理”,再对每个交接点单独做一次可回滚的变更,观察异常归属。只有当你能指出新异常在哪个交接点首次出现,下一步动作才成立。
URL提交通常涉及三个动作:发现入口(站点地图、内链、日志里出现的地址)、提交动作(把地址告知处理方)、处理结果(抓取、规范化、索引状态变化)。修复往往只改了其中一个动作,但新异常可能出现在另一个动作上。
判断是否共用链,看三个可核对的证据:
假设一个例子:你修复了站点地图里一批地址的格式错误,重新提交后,原先“未处理”的地址开始被处理,但同一批里另一些地址变成了“已排除”。这不一定是修复引入的bug,也可能是处理方开始读取这些地址后,才暴露出它们本就存在的规范化冲突。这个例子是假设的,用来示范如何比较,不代表任何真实项目结果。
拆链的关键是让每段只改变一个变量,并且每段都能单独回退。可按下面顺序做:
每段做完后,记录一个具体动作和它的结果:例如“把A批地址从站点地图移除后,B批地址的处理状态是否随之改变”。如果B批跟着变,说明A和B共用了一个输入;如果B不变,说明两者独立。这个结果直接决定下一步是继续拆入口,还是转去核对处理方的规则。
上面这套拆法有一个明确的失效条件:如果两次变更之间隔了足够长的时间,而处理方的处理节奏本身就有波动,那么你观察到的“新异常”可能只是正常波动,不是依赖链造成的。
反例:你在周一改了入口,周三改了提交动作,周五看到新异常。此时无法把异常归给任何一次变更,因为两次变更和处理节奏叠在一起。这种情况下,拆链结论不成立,需要重新做一次只含单一变量的对照。
另一个失效条件是:新异常涉及的是完全不同类型的对象。例如旧异常是“未发现”,新异常是“已发现但被排除”。这两者可能落在同一条链上,也可能落在两条互不相干的链上。若无法用对象重叠来区分,就不能断言它们共用依赖。
选一个交接点,只改它,其他保持不变。一个可执行的动作是:把本次提交的地址分成两组,一组保持原样,一组从入口中暂时移除,然后只对保持原样的那组执行提交。结果会告诉你两件事:
得到这个结果后,下一步不是继续扩大提交范围,而是回到那个交接点,检查它是否同时承担了“发现”和“处理”两个职责。若是,就需要把这两个职责拆成两个独立入口,再分别验证。只有当单一变量变更能稳定复现异常归属时,才适合继续推进更大范围的提交。