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

JavaScript 生成器的 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() 发挥作用,生成器内部得有对应的错误处理逻辑。否则只是把错误原样扔出去。
例如:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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: false,value是下一个yield的值 - 如果错误没被捕获,或
catch后执行到函数末尾/遇到return,则done: true,value是返回值(或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')) 来触发清理逻辑。

















