微任务中未捕获异常不会中断微任务队列执行,仍会依次运行后续微任务并分别报错;该异常被标记为未处理拒绝,在本轮微任务清空后触发unhandledrejection事件;事件循环照常进入宏任务阶段。

微任务执行期间抛出未捕获异常,**不会中断当前微任务队列的清空过程**,但该异常会作为未处理的拒绝(unhandled rejection)被记录,并在本轮事件循环结束时触发 unhandledrejection 事件(若监听了);之后事件循环照常进入宏任务阶段。
微任务队列仍会被完整执行
JavaScript 引擎在遇到微任务中未捕获的异常时,不会跳过后续微任务。它会继续执行队列中剩余的微任务(如其他 Promise.then、queueMicrotask 回调),每个都独立运行、独立报错。
- 例如:连续注册三个
queueMicrotask,第二个抛错,第一和第三个仍会执行 - 错误不会“阻塞”或“终止”微任务队列——这是与同步代码中
throw的关键区别
异常被标记为“未处理的 promise 拒绝”
如果异常来自 Promise 链(如 Promise.reject() 未被 .catch() 或 try/catch 捕获),引擎会在微任务执行完毕后,将该 rejection 记录为 unhandled。此时:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- Node.js 中触发
process.on('unhandledRejection') - 浏览器中触发全局
unhandledrejection事件(可监听) - 控制台通常显示 “Uncaught (in promise)” 警告,但不中断事件循环
事件循环继续推进到下一个阶段
无论微任务是否抛错,只要微任务队列清空(哪怕中间多次报错),事件循环就会按序进入下一轮:
- 执行一个宏任务(如 setTimeout 回调、I/O 回调、UI 渲染等)
- 然后再次清空新的微任务队列(包括新产生的 Promise 回调)
- 错误本身不会导致事件循环“卡死”或跳过后续宏任务
如何避免意外行为?
关键不是阻止错误发生,而是确保 promise 链有终点处理:
- 总是用
.catch()或await+try/catch处理异步结果 - 对
queueMicrotask内部手动加try/catch,防止静默失败影响调试 - 开发期监听
unhandledrejection,及时发现遗漏的错误处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










