generator 的 throw() 方法只能向暂停中的生成器抛出异常,且需内部有 try...catch 才能捕获;若生成器已结束或未启动,则直接报错。

Generator 的 throw() 方法允许在外部向生成器内部抛出异常,从而中断其执行并进入 catch 块(如果存在)。关键在于:异常只能抛给**暂停中的生成器**(即上一次 next() 返回后、下一次 next() 调用前的状态),且必须在生成器函数体内有对应的 try...catch 才能被捕获。
throw() 的基本用法和触发条件
generator.throw(exception) 会将异常注入到生成器当前暂停的位置(即上次 yield 表达式处),并让控制权立即跳转到最近的 try...catch 块。若生成器已结束(done: true)或尚未启动(未调用过 next()),则直接抛出错误,不会进入生成器内部。
- 必须在生成器处于“暂停中”状态时调用,否则无效或报错
- 抛出的异常类型任意,但只有生成器内部有匹配的
catch才能捕获 - 调用
throw()后,生成器状态变为done: false(除非catch中又return或执行完)
在生成器内部捕获 throw 抛出的异常
需要在生成器函数中用 try...catch 包裹 yield 表达式或后续逻辑。注意:异常不是抛给 yield 本身,而是抛给它所在的执行上下文。
function* gen() {
try {
console.log('start');
yield 1;
console.log('after first yield');
yield 2;
} catch (e) {
console.log('caught:', e.message);
}
console.log('end');
}
<p>const g = gen();
g.next(); // { value: 1, done: false }
g.throw(new Error('boom')); // caught: boom → 输出 "caught: boom" 和 "end"
</p>
此时 throw() 触发了 catch,跳过了 yield 2,继续执行 console.log('end'),最后生成器正常结束。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
throw() 与 next() 的协同关系
throw() 和 next() 共享同一个暂停点。每次 next() 让生成器运行到下一个 yield 并暂停;而 throw() 则是在该暂停点“注入异常”,替代原本的 next() 返回值。
- 第一次
next()启动生成器,执行到第一个yield暂停 - 此时调用
throw(),异常被try...catch捕获,生成器继续执行直到结束或再次yield - 如果生成器在
catch中又yield,后续仍可调用next()或throw()
常见陷阱与注意事项
容易误以为 throw() 总是能被 yield 左侧捕获——其实它捕获的是整个 try 块内的同步执行流,而非某个特定 yield 表达式。
- 若生成器没有
try...catch,throw()会让生成器立刻终止,并把异常抛回调用方 - 不能对已结束的生成器调用
throw(),否则报Generator is already finished -
throw()不会恢复执行,除非catch中显式yield或return
不复杂但容易忽略细节:关键是暂停状态 + 内部 try...catch,两者缺一不可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










