写脚本需求时描述例外,核心不是把每种情况都穷举,而是给每条例外绑定一个可判断的触发条件,并写清触发后的动作。对已有经验的人来说,常见的分歧在于:是把例外写成“遇到异常就人工介入”,还是写成“满足某条件就自动降级处理”。前者适合例外稀少、判断依赖语义的场景;后者适合例外高频、判断可量化、且错误代价可控的场景。选错方向的代价是脚本频繁中断,或错误被静默放大。
把人工经验转成脚本需求前,先给例外分类。可枚举的例外有明确字段或状态,比如标题为空、目标页返回非成功状态、同一模板重复出现。不可枚举的例外依赖语义判断,比如“这段文案读起来像硬凑关键词”“这个页面意图和栏目不匹配”。两类例外的描述方式完全不同。
当 字段A 为空 且 字段B 存在 时,执行动作C,让脚本自己处理。当 判断项X 无法用现有规则判定时,输出候选并挂起,保留人工确认环节。如果强行把不可枚举的例外塞进规则,脚本会不断产生假阳性和假阴性,最后没人敢用。反过来,把可枚举例外也丢给人工,脚本就退化成提醒工具,省不下时间。
假设你要把“批量检查页面标题是否合格”的人工经验写成脚本。人工经验里有一条:标题和正文主题明显不符时要改。脚本无法直接判断“明显不符”,这时有两种做法。
适用条件:例外出现频率高,且降级动作的后果可逆、代价低。例如标题缺失时自动用正文首句截取候选,并标记为待复核。动作结果是脚本继续跑完,产出候选清单,你下一步只需复核被标记的项,而不是从头重做。
适用条件:例外稀少,但一旦误判影响面大。例如涉及栏目归属或页面意图的改动,脚本不应自动改,而应输出“疑似不匹配”的页面清单。动作结果是流程暂停在这一点,你下一步要先人工判定,再决定是否让脚本继续。
选择依据可以落到三个问题上:例外多久出现一次、判断错误能不能低成本回退、处理例外的人是否具备判断所需的上下文。三个答案偏向“高频、可回退、上下文充分”时选自动降级;偏向“低频、难回退、上下文缺失”时选挂起待审。
无论选哪种做法,脚本需求中的每条例外都应包含以下信息,否则实现者只能靠猜。
举例说明,假设某条规则是“正文段落少于两段时视为内容不足”。需求里应写成:当正文段落数小于 2 且页面类型为文章时,标记为内容不足并跳过后续标题优化,记录页面标识和段落数。这样实现者知道边界在哪,你也能在结果里区分“真内容不足”和“段落识别出错”。
脚本跑完一轮后,先看例外清单的构成,而不是只看处理了多少页面。如果某类例外反复出现,说明触发条件太宽或数据源不稳,应回到需求里收紧条件。如果某类例外几乎不出现,可以考虑把它并入自动处理,减少人工环节。
这里要注意,一次改动前后的对比不能直接归因于脚本本身。搜索需求会随季节和事件变化,数据采集口径也可能不同。比较时至少固定观察窗口和采集方式,再判断例外数量变化是规则调整带来的,还是外部波动造成的。请求量或抓取量归零也不能单独证明处理正确,它同样可能来自采集中断或页面状态变化。
把例外写清楚的实际收益是:脚本不再因为一条模糊规则频繁中断,你也能从例外记录里看出人工经验中哪些部分还没被准确表达。下一步动作应基于例外清单的分布来决定,而不是基于脚本是否跑完。