此模式下抛出错误后,Generator函数能否继续执行?
生成器函数抛出错误后是否会继续执行后续代码?
我原本认为生成器函数里抛出错误后,后续代码不会执行,测试结果也符合这个认知,但又有点不确定,甚至怀疑自己是不是错了。
项目里遇到个怪事:某个生成器函数好像在抛出一次错误后还继续执行了,但我没法复现这个场景,代码里也找不到问题,所以来确认这个点。
function* someMethod(i) { try { yield i; throw new Error('error text'); yield call(anotherMethod); // << 这行应该永远不会执行,对吧? } catch (err) { console.error(err); } }
结论与分析
针对你提供的这段代码,yield call(anotherMethod);确实永远不会执行。原因很明确:throw new Error('error text');执行后,代码会立即跳转到对应的catch块,跳过throw语句之后的所有代码,所以这行yield根本没有执行的机会。
至于你项目中遇到的异常情况,可能的诱因包括:
- 外部代码调用了生成器的
generator.throw()方法:这种情况下,生成器内部的catch块捕获错误后,如果后续还有可执行的yield语句,生成器是可以恢复执行的 - 错误被外层的
try/catch结构捕获:如果生成器内部的错误没有中断当前执行流程,可能导致后续代码意外运行 - 异步场景下的逻辑漏洞:如果生成器结合了异步操作,错误处理的时序问题可能造成“错误后仍执行”的假象
内容的提问来源于stack exchange,提问作者Slbox
相关产品推荐
相关产品推荐

