javascript迭代器无内置错误恢复机制,其next()方法抛出的错误需由调用方用try...catch处理,done: true后不可恢复,重用需重新获取迭代器。

JavaScript 迭代器本身**没有内置的错误恢复机制**。它是一个只读、单向、状态驱动的数据消费协议,设计目标是按需提供值并明确标识结束,而不是容错或重试。
迭代器不处理错误,只暴露错误
迭代器的 next() 方法在规范中只要求返回 { value, done } 结构,不承诺捕获或处理内部异常。如果迭代逻辑中抛出错误(比如访问了 null 的属性、数组越界未防护、异步操作 reject 未拦截),该错误会直接向上冒泡,由调用方(如 for...of、扩展运算符、解构)捕获或导致程序中断。
例如:
-
const iter = { next() { throw new TypeError('boom') } };—— 调用iter.next()立即报错,无恢复逻辑 - 自定义生成器中
yield someObj?.id若someObj为null,也会在next()调用时抛出TypeError
真正的“恢复”靠外部控制流
所谓“错误恢复”,实际是开发者在使用迭代器时,主动用 JavaScript 的异常处理机制包裹迭代过程。迭代器只是被消费的一环,恢复责任不在它身上。
- 用 try...catch 包裹 for...of 循环,捕获某次
next()抛出的错误,然后选择跳过、记录、或终止 - 在生成器函数内部用 try...catch 捕获 yield 前/后的异常,再决定是
yield默认值、return提前结束,还是再次throw - 对 Promise 异步迭代器(
AsyncIterator),需配合for await...of+try...catch,或用.next().catch()显式处理拒绝
注意:done: true 后继续调用不等于“恢复”,而是契约遵守
有些开发者误以为迭代器“恢复”是指 done: true 后还能重新开始。但规范明确要求:一旦 done: true,后续所有 next() 都必须稳定返回 { value: undefined, done: true }。这不是恢复,而是终态保证——避免消费方因状态混乱而无限循环或崩溃。
想重用迭代逻辑,应重新获取迭代器对象(如再次调用 arr[Symbol.iterator]() 或重新执行 genFn())。
生成器函数可模拟局部恢复,但非自动
生成器函数体内可以写 try...catch,并在 catch 中 yield 备用值或 continue 到下一轮,看起来像“出错后继续”。但这完全由你编码实现,引擎不会自动插入任何恢复逻辑。
例如:
function* safeValues(arr) { for (const item of arr) { try { yield item.toUpperCase(); } catch { yield '(invalid)'; } } }- 这里不是迭代器恢复了,而是你在每次 yield 前做了防御性处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











