真正可靠的自定义迭代器应将异常纳入遍历流程:在__next__()中捕获解析异常、结构化记录脏数据、跳过并继续,禁止hasnext()执行可能失败操作,暴露错误统计与干预接口,实现弹性数据流。
在异构数据扫描场景中,单条脏数据(如字段格式错误、编码异常、空值违规、json解析失败等)直接抛出异常,往往导致整个迭代中断——这与“保障业务连续性”的工程目标背道而驰。真正可靠的自定义迭代器,不是回避异常,而是把异常纳入遍历流程本身:识别它、记录它、跳过它、继续它。
明确异常边界,隔离脏数据影响范围
关键前提是不把异常“上抛”到迭代器使用者(比如 for 循环或 Stream 处理链)。应在迭代器内部完成捕获与决策:
- 仅对单次元素生成过程做 try-catch,例如在 computeNext()(Guava)、__next__()(Python)或 operator*()/operator++()(C++)中包裹核心解析逻辑
- 禁止在 hasNext() 中执行可能失败的 IO 或解析操作——该方法只应返回确定状态(有/无下一个),否则会破坏迭代契约
- 将原始脏数据、异常类型、发生位置(如第 N 条记录、文件行号、API 响应 ID)结构化记录到日志或监控通道,而非仅打印堆栈
设计可恢复的迭代状态机
传统 Iterator 接口不显式支持“跳过并重试”,需靠状态管理实现韧性。以 Guava AbstractIterator 为例:
- 在 computeNext() 内部用 while 循环持续拉取后备数据源的下一项,直到获得合法元素或确认耗尽
- 每次解析失败时,调用自定义的 onInvalidRecord(record, ex) 回调,再自动 fetch 下一条,不改变外部可见状态
- 通过私有计数器 trackSkippedCount 和 trackErrorRecords 统计脏数据指标,供后续告警或补偿任务使用
提供可观测与可干预的异常上下文
单纯“静默跳过”不可取,生产系统需要闭环治理能力:
- 迭代器实例暴露 getLastError()、getSkippedCount()、getErrorSamples() 等只读方法,便于调用方在遍历结束后主动检查质量
- 支持构造时传入 ErrorHandler 接口,允许业务侧决定:是丢弃、降级为默认值、写入死信队列,还是触发熔断开关
- 与企业级监控体系对接(如 Prometheus + Grafana),将 skip_rate、parse_error_p95 等指标自动上报
Python 示例:带自愈能力的 CSV 行迭代器
以下是一个轻量但实用的实现片段:
class FaultTolerantCsvIterator:def __init__(self, file_path, error_handler=None):
self.reader = csv.DictReader(open(file_path))
self.error_handler = error_handler or self._default_handler
self.skipped = 0
self.errors = []
def __iter__(self): return self
def __next__(self):
while True:
try:
row = next(self.reader)
return self._validate_and_enrich(row)
except (csv.Error, ValueError, KeyError) as e:
self.skipped += 1
self.errors.append((f"line-{self.reader.line_num}", str(e)))
self.error_handler(e)
except StopIteration:
if self.skipped > 0:
logging.warning(f"Skipped {self.skipped} invalid rows")
raise
这种设计让异构扫描从“脆弱线性流程”变为“弹性数据流”,单点故障不再等于全局失败。











