位置:首页 > JavaScript > JavaScript生成器中throw方法抛出错误的用法详解

JavaScript生成器中throw方法抛出错误的用法详解

时间:2026-08-18  |  作者:白桃企划师  |  阅读:0

Ja vaScript生成器的throw()方法是向暂停处注入并抛出错误,需内部try...catch捕获;若未捕获则冒泡终止生成器;返回{value,done}对象,常用于外部中断与资源清理。

Ja vaScript 中生成器怎么用 throw 方法抛出错误

Ja vaScript 生成器里的 throw(),并不只是简单地“把错误抛出去”。

更准确地说,它是把一个错误送进生成器内部并当场抛出。这样一来,生成器会从上一次暂停的位置恢复执行,也就是停在 yield 表达式的那个点上,再由内部的 try...catch 去接住这个错误。

从本质上看,它属于生成器恢复控制流的一种方式,和 next()return() 是并列关系。

throw() 的作用位置很关键

调用 gen.throw(err) 之后,错误并不会直接在这一行外部调用点炸开。

它会被“塞回”生成器内部,并且会在当前停住的那个位置,也就是 yield 处,立刻触发 throw

如果这个 yield 所在的位置外面没有一层 try...catch 兜底,错误就会继续往上冒。最终,生成器会进入 completed 状态,同时把异常抛回给调用方,效果上和未捕获异常基本一样。

  • 若生成器已结束(done: true),调用 throw() 会直接抛出错误(无论有没有 catch)
  • 若生成器尚未启动(还没调过 next()),throw() 会让执行直接进入函数体,但会在第一行(或第一个 yield 前)抛错 —— 此时仍可被函数体顶层的 try...catch 捕获

必须配合 try...catch 才能真正“捕获”

想让 throw() 发挥作用,生成器内部必须有对应的错误处理逻辑。

否则,它只是把错误原样扔出去。

例如:

function* demo() {
try {
console.log('start');
yield 'a';
console.log('after yield');
} catch (e) {
console.log('caught:', e.message);
}
yield 'b';
}

使用方式:

const gen = demo();
gen.next(); // { value: 'a', done: false }
gen.throw(new Error('boom')); // caught: boom
// 输出:start → a → caught: boom → { value: 'b', done: false }

throw() 返回值和状态变化

throw() 返回一个标准的迭代器结果对象 { value, done },和 next() 一样。

  • 如果错误被内部 catch 住,且后续还有 yield,则 done: falsevalue 是下一个 yield 的值
  • 如果错误没被捕获,或 catch 后执行到函数末尾/遇到 return,则 done: truevalue 是返回值(或 undefined
  • 如果生成器已结束,throw() 不返回结果,而是直接抛出错误

实际用途:外部中断 + 清理资源

它常见于需要响应外部取消或异常终止的场景,比如模拟可中断的异步任务。

function* fetchWithTimeout() {
let controller;
try {
controller = new AbortController();
yield fetch('/api', { signal: controller.signal });
} catch (e) {
if (e.name === 'AbortError') {
console.log('aborted! cleaning up...');
}
throw e;
} finally {
if (controller) controller.abort();
}
}

这时你可以随时调用 gen.throw(new DOMException('aborted', 'AbortError')),来触发清理逻辑。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多