Generator.prototype.throw()

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

throw() 方法用于 Generator 实例,它会在生成器的当前暂停位置插入一个 throw 语句,告知生成器发生错误,并允许其处理错误、执行清理或关闭自身。

语法

js
generatorInstance.throw(exception)

参数

exception

要抛出的异常。为了便于调试,最好将其设为 Errorinstanceof

返回值

如果抛出的异常被 try...catch 捕获,并且生成器恢复执行以产生更多值,它将返回一个具有两个属性的 Object

done

一个布尔值。

  • 如果生成器函数的控制流已到达末尾,则为 true
  • 如果生成器函数能够产生更多值,则为 false
value

下一个 yield 表达式产生的值。

异常

TypeError

如果生成器已在运行,则抛出错误。

如果 exception 未在生成器函数内的 try...catch 块中捕获,它也将被抛给 throw() 的调用者。

描述

调用 throw() 方法时,可以将其视为在生成器的当前暂停位置插入了一个 throw exception; 语句,其中 exception 是传递给 throw() 方法的异常。因此,在典型流程中,调用 throw(exception) 将导致生成器抛出异常。但是,如果 yield 表达式被包含在 try...catch 块中,则错误可能会被捕获,并且控制流可以在错误处理后恢复,或者优雅地退出。

示例

使用 throw()

以下示例展示了一个生成器以及使用 throw 方法抛出的错误。错误可以像往常一样被 try...catch 块捕获。

js
function* gen() {
  while (true) {
    try {
      yield 42;
    } catch (e) {
      console.log("Error caught!");
    }
  }
}

const g = gen();
g.next();
// { value: 42, done: false }
g.throw(new Error("Something went wrong"));
// "Error caught!"
// { value: 42, done: false }

规范

规范
ECMAScript® 2026 语言规范
# sec-generator.prototype.throw

浏览器兼容性

另见