JavaScript生成器中throw方法抛出错误的用法详解
时间:2026-08-18 | 作者:白桃企划师 | 阅读:0Ja vaScript生成器的throw()方法是向暂停处注入并抛出错误,需内部try...catch捕获;若未捕获则冒泡终止生成器;返回{value,done}对象,常用于外部中断与资源清理。
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: 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')),来触发清理逻辑。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- JavaScript正则表达式批量处理HTML标签转义与替换方法
- 时间:2026-08-21
-
- JavaScript函数默认参数的精准JSDoc类型注解方法
- 时间:2026-08-21
-
- JavaScript设置Cookie的SameSite属性防范CSRF攻击
- 时间:2026-08-21
-
- JavaScript中BOM如何打开新的浏览器窗口标签
- 时间:2026-08-20
-
- JavaScript微任务队列在事件循环中的执行机制
- 时间:2026-08-20
-
- JavaScript中网络超时如何用流程控制实现中断
- 时间:2026-08-20
-
- JavaScript防抖函数原理与减少高频事件触发方法
- 时间:2026-08-20
-
- TypeScript六个颠覆认知的核心知识点解析
- 时间:2026-08-20
精选合集
更多大家都在玩
大家都在看
更多-
- 以下哪种食材被称为“地下苹果” 蚂蚁庄园今日答案9.18
- 时间:2026-09-17
-
- 蚂蚁庄园今天答题答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园答题今日答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园小课堂2026年9月18日最新题目答案
- 时间:2026-09-17
-
- 小鸡答题今天的答案是什么2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园每日答题答案2026年9月18日
- 时间:2026-09-17
-
- 蔬菜洗完掉色,说明是被染色了,是真的吗 蚂蚁庄园今日答案9月18日
- 时间:2026-09-17
-
- 满襟蜡绘花纹巧染就花纹当绣裳说的是哪种传统技艺 蚂蚁新村今日答案2026.9.17
- 时间:2026-09-17
