例外情况不要写成“遇到异常就跳过”,而要写成“什么条件下不执行默认动作、改走哪条分支、留下什么可核对的输出”。写脚本需求时,把例外拆成触发条件、替代动作和记录字段三部分,才能让运营、开发和审核对同一件事有相同理解。
假设团队在整理应用商店排名相关的关键词覆盖情况。运营看到某些词在多个地区都有展示,认为脚本应该把这些词全部纳入监控;开发跑完脚本后反馈,有一部分词在部分地区的返回结果为空,按现有逻辑被直接丢弃。两边都没说错,但描述的不是同一件事:运营说的是“曾经观察到展示”,开发说的是“本次请求没有取到结果”。
这种分歧通常有两种解释。第一种是数据源本身有地区差异,某些词只在特定语言或特定商店区域出现,换一个地区请求自然为空。第二种是采集环节不稳定,比如请求频率、返回结构变化或字段缺失,导致本来存在的结果这次没有取到。两种解释对应的处理方式完全不同:前者应该按地区拆分条件,后者应该先修采集再谈覆盖。
不要靠“再跑一次看看”来判断。更有效的做法是固定一组样本词,分别在两个维度上做对照:同一地区重复请求多次,以及同一时间点换不同地区请求。如果同一地区重复请求的结果稳定,而不同地区之间差异明显,更接近第一种解释;如果同一地区重复请求本身就时有时无,更接近第二种解释。
这里要注意,请求量下降或某个字段为空,不能单独证明脚本逻辑写错了。它也可能是上游返回结构变化、请求被限流、或者本次样本刚好落在没有覆盖的词上。把这些可能列进需求文档,比在群里争论“到底是谁的问题”更有用。
一段合格的例外描述,至少要让执行者不需要再问“然后呢”。可以按下面三段来写:
举例来说,假设需求是“抓取各地区关键词的展示位置”。默认动作是记录位置;例外可以写成:当某地区返回为空且同一词在相邻地区有结果时,不写入位置,改为写入 status=region_mismatch,并保留该地区的原始返回摘要。这样运营看到的是“地区不匹配”,开发看到的是“已按分支处理”,双方核对的是同一个字段,而不是各自的印象。
假设脚本原本写的是“返回为空就跳过”。上线后发现某个地区的覆盖词大量消失,但无法判断是词真的没了,还是采集失败。因为跳过的记录没有留下任何字段,下一步只能重新跑一遍,而重跑又可能遇到同样的限流。反过来,如果例外写成“返回为空时记录 empty_reason 并保留请求参数”,就能直接看出空结果是集中在某几个地区,还是分散在所有地区。这个判断会决定下一步是先改采集策略,还是先调整词表范围。
需要说明的是,这个例子是假设的比较方法,不是某个真实项目的结论。实际使用时,地区划分、字段命名和重试次数都要按自己团队的数据结构来定。
第一,例外条件不要写成对某个角色的依赖。比如“运营确认后再处理”不是脚本能执行的分支,它只是流程中的等待环节。如果确实需要人工确认,应该写成“命中条件后写入待确认队列,脚本继续处理其他词”,而不是让整个任务停下来。
第二,比较改动效果时,不要把一次改动前后的差异直接当成因果。应用商店的展示会受季节、版本更新节奏和搜索需求变化影响,采集时间不同也可能带来差异。更稳妥的做法是保留改动前后的原始记录,在相同地区、相近时间窗口内对照,并明确哪些差异属于采集波动,哪些属于覆盖变化。
把例外写成可核对的项目,真正改变的不是脚本本身,而是团队讨论问题的方式:从“我觉得这个词有排名”变成“这条记录在什么条件下被标记、下一步该查哪个字段”。这比在需求里补一句“特殊情况特殊处理”更能减少返工。