微任务报错需构建多层容错架构:代码层显式拦截Promise/async错误,运行时层启用onerror与onunhandledrejection兜底,框架层用错误边界+状态机隔离异步,构建层通过ESLint检查与沙箱隔离防控风险。

微任务继承链中报错容易引发未捕获异常,进而导致整个 JavaScript 执行上下文崩溃(如 Promise 链中断、async/await 后续不执行、UI 卡死或白屏)。这不是单靠 try-catch 就能覆盖的问题,关键在于构建**多层容错架构**——从代码层、运行时层到框架层逐级兜底,把错误影响控制在最小范围。
代码层:Promise 链与 async/await 的显式错误拦截
微任务错误(如 Promise.reject、throw 在 then/catch 或 await 后)若未被处理,会触发 unhandledrejection。必须在每个异步链末端显式处理:
- 每个 then() 后紧跟 catch(),避免漏掉中间环节;
- 使用 async/await 时,用 try/catch 包裹整个 await 块,而非只包单个 await;
- 对不确定是否 reject 的第三方调用(如 fetch、SDK 方法),统一封装为带默认 fallback 的工具函数,例如:
const safeFetch = async (url) => { try { return await fetch(url); } catch (e) { logError('fetch failed', e); return null; } };
运行时层:全局异常捕获 + 微任务兜底机制
浏览器提供两级兜底能力,需同时启用:
- 监听 window.onerror 捕获同步错误;
- 监听 window.onunhandledrejection 捕获未处理的 Promise rejection(含微任务链中断);
- 在捕获后做三件事:记录堆栈(含 Promise chain trace)、上报监控系统、触发轻量级恢复(如重置当前模块状态、提示用户“操作暂不可用”而非整页崩溃);
- 注意:onunhandledrejection 的 event.reason 可能是 Error 实例,也可能是原始值,需兼容判断。
框架层:组件级错误边界与异步状态隔离
前端框架(如 React、Vue)支持错误边界(Error Boundary)或 errorCaptured 钩子,但默认不捕获异步错误。需主动增强:
- 在关键业务组件内,将异步逻辑与 UI 渲染解耦:用状态机管理 loading/error/success,错误发生时不销毁组件,仅切换 UI 状态;
- 对可能失败的微任务操作(如表单提交后的 confirm 弹窗、轮询请求),封装成独立可重试的 service,失败后自动降级(如跳过非核心步骤、返回缓存数据);
- 避免在 useEffect / onMounted 中直接 await 无兜底的 Promise,改用 useAsync、useSWR 等具备内置错误重试与 fallback 的 Hooks。
构建与部署层:静态检查 + 运行时沙箱隔离
部分微任务错误源于开发阶段疏漏,可通过工程化手段前置拦截:
- 在 CI 流程中接入 ESLint 插件(如 eslint-plugin-promise),强制要求 Promise 链必须有 catch 或 finally;
- 对高风险模块(如支付、登录)启用微前端沙箱(如 qiankun 的 strict isolate 模式),隔离其 Promise 全局错误,防止污染主应用;
- 在生产环境注入轻量级运行时沙箱 wrapper,对关键异步调用自动包裹 try/catch 并上报,不修改源码即可增强韧性。

















