直接回答:例外情况不要写成“其他情况按常规处理”,而要把触发条件、判断依据、动作分支和人工接管点分别写清楚。脚本需求里最容易被忽略的不是主流程,而是“当某个判断依据缺失或互相矛盾时,脚本该停、该跳过,还是该交给人工”。
把人工经验转成脚本时,例外通常分成两类。第一类是可判定例外:你能给出明确字段、阈值或状态组合,脚本能稳定判断。例如“当页面返回状态码为 404 且站内仍有内链指向它”时,人工经验可能是先记录、不立刻删除。第二类是不可判定例外:缺少必要数据、两个信号互相冲突,或需要业务背景才能判断。例如页面标题为空,但正文完整、有内链、有流量记录,此时该补标题还是先观察,脚本无法仅凭现有字段决定。
两类例外的写法不同。可判定例外适合写成条件分支;不可判定例外适合写成“暂停并输出待人工确认清单”。把不可判定例外硬塞进规则,脚本会给出看似确定、实际错误的结果。
当你能指出判断依据来自哪个字段、取值是什么、由谁维护时,就把它写成脚本能执行的分支。描述结构建议包含四段:触发条件、判断依据、执行动作、输出记录。
例如假设一个场景:你希望脚本识别“内容页正文过短但仍被多个页面链接”的情况。人工经验是这类页面不直接删除,而是先列入观察。写成需求时可以说:当正文长度低于设定阈值,且入站内链数量大于设定值时,脚本不执行删除动作,只写入“待观察”标记,并输出页面地址和判断依据。这样下一步的人工复核就有明确入口,而不是在一堆“异常”里重新找。
当关键字段缺失、数据源之间不一致,或规则之间会互相覆盖时,不要继续套用默认动作。此时更稳妥的选择是让脚本输出“无法判定”,而不是替人做决定。判断依据可以是:必要字段为空、两个数据源给出相反结论、同一条规则被更高优先级规则覆盖但未记录原因。
实际动作可以这样设计:脚本遇到不可判定例外时,不修改任何线上内容,只生成一条待确认记录,包含页面地址、命中的规则、缺失或冲突的字段、以及建议人工查看的位置。这个动作的结果会直接影响下一步——人工确认后,要么补充判断依据,把这条例外升级为可判定规则;要么确认它属于一次性情况,不进入脚本。
这里有一个容易踩的坑:把“请求量下降”或“抓取量归零”单独当成处理正确的证据。这类现象还可能来自采集时间变化、需求波动、统计口径调整或上游数据延迟。假设你比较改动前后两周的数据,如果这两周正好跨过季节变化或站内其他改动,就不能把差异全部归给这次脚本处理。比较时应尽量固定观察窗口、记录同期其他变化,并明确哪些结论只是相关、尚未确认因果。
人工经验往往散在聊天记录和口头说明里。转成脚本需求时,可以先用一张例外表把每条经验固定下来,再交给开发或配置人员。表里至少包含:例外名称、触发条件、判断依据、执行动作、输出位置、人工接管点。表不必复杂,但要能回答“脚本怎么知道该走这条分支”。
一个简化的假设例子:if 状态码 == 404 and 内链数 > 0 then 标记为待确认,不删除。这条规则的重点不是代码本身,而是它把人工经验里的“先别动”变成了可检查的条件。如果缺少“内链数”这个字段,就应该写成不可判定例外,而不是默认删除或默认保留。
完成这些动作后,下一步不是立刻扩大脚本适用范围,而是先用一小批数据验证例外分支是否按预期触发,并确认输出记录能被人工读懂。只有例外情况被稳定识别和记录,人工经验才算真正转成了可维护的脚本需求。