全局错误拦截器是兜底防线,用于捕获未处理的异步失败:浏览器通过unhandledrejection(Promise拒绝)和window.onerror(同步错误等)互补覆盖;jQuery用ajaxSetup统一处理AJAX错误;Vue/React需结合框架钩子与unhandledrejection;Node.js须监听unhandledRejection和uncaughtException防进程退出。

全局错误拦截器不是给“异步操作”本身加的,而是捕获那些没人处理的异步失败——比如没写 catch 的 Promise 拒绝、没包 try/catch 的 await 报错。它是一道兜底防线,不能替代代码里的主动处理。
浏览器环境:监听 unhandledrejection + window.onerror
这两个事件互补,覆盖绝大多数前端异常场景:
-
unhandledrejection:专抓未被处理的 Promise 拒绝(包括 async 函数里抛出但没 catch 的错误)
注册方式:window.addEventListener('unhandledrejection', e => { console.error('未处理的 Promise 错误:', e.reason); }); -
window.onerror:捕获同步错误、脚本加载失败、定时器里抛出的异常等,但它不捕获 Promise reject
注册方式:window.onerror = (msg, url, line, col, error) => { console.error('同步错误:', error); }; - 两者都必须在页面早期注册(比如
<head>里或入口 JS 开头),否则可能错过初始化阶段的异常
jQuery 场景:用 $.ajaxSetup 统一配置 error 回调
如果你大量使用 $.get、$.post 或 $.ajax,可通过 $.ajaxSetup 设置默认错误处理逻辑:
- 它只对 jQuery 的 AJAX 请求生效,不影响原生 fetch 或其他库
- 示例:
$.ajaxSetup({ error: (xhr, status, err) => { alert('请求失败: ' + err); } }); - 注意:它无法捕获 Promise 链中 .then() 里手动 throw 的错误,这类仍需 unhandledrejection 监听
Vue/React 等框架:结合运行时钩子 + 全局 Promise 拦截
框架自身提供组件级错误捕获,但要覆盖全部异步,仍需底层配合:
- Vue 中可设置
app.config.errorHandler,捕获组件 render 和生命周期中的同步/异步错误(如setup()里 await 报错) - React 中可用
ErrorBoundary捕获渲染层错误,但异步逻辑(如 useEffect 里的 fetch)失败仍需靠unhandledrejection - 无论什么框架,只要用了 Promise,就绕不开
unhandledrejection这一层兜底
Node.js 环境:process.on('unhandledRejection')
服务端异步错误兜底更关键,否则未处理的 Promise 拒绝会导致进程退出(v15+ 默认行为):
- 必须显式监听:
process.on('unhandledRejection', (reason, promise) => { console.error('未处理拒绝:', reason); }); - 可搭配
process.on('rejectionHandled', promise => { ... })调试“延迟 catch”问题 - 注意:它不捕获同步错误或未被捕获的异常,需额外监听
process.on('uncaughtException', err => { ... })

















