构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦
在开发阶段,我们常使用 try-catch 回调或链式调用封装思路来处理特定错误,或在网络层面通过 Axios 错误处理封装方案集中处理请求和响应阶段的错误。但这些方案往往局限在特定场景下,无法满足生产环境下对全局错误处理的需求。因此,构建一套全局错误处理机制显得尤为重要。
一、为什么要做全局错误处理?
1、将业务逻辑与错误处理解耦
在业务模块中,我们真正关心的是数据是否可用,以及页面状态如何变化,并不关心网络异常的类型、提示和跳转。所以需要将错误策略抽离到全局层,让业务代码只专注于处理业务,全局错误处理层专注于处理各类错误。解耦后业务层和全局错误层都更加纯粹,也更有利于长期维护和拓展。
2、为监控和埋点提供统一入口
项目上线后,对于错误信息除了要建立临时应对和处理机制外,还需要定时收集和上报,给错误分级,还要收集用户的环境信息,这样才能给开发者提供准确的数据信息,从而针对性的修复 bug 以及性能优化。
二、Vue 中的基础全局错误处理方式
1、Vue 中全局错误处理写法
在 Vue 3 中,官方提供了一个明确的入口:app.config.errorHandler。在 main.js 中,添加如下代码即可:
const app = createApp(App)
app.config.errorHandler = (err, instance, info) => {
console.error(err)
}
2、它会捕获哪些错误?
app.config.errorHandler 只会捕获 Vue 运行时上下文中的错误,包括:
- 组件 setup / render 中的同步错误
- 生命周期钩子中的错误
- 模板渲染期间的错误
- watch / computed 中抛出的错误
- 被 Vue 追踪的 Promise 链中的错误
3、它不会捕获哪些错误?
不在上述范围内,脱离了 Vue 的响应式调度体系的错误均不会被捕获,比如:
setTimeout(() => { throw new Error('timeout error') // 不会捕获 })
fetch('/api').then(() => { throw new Error('fetch error') // 不会捕获 })
所以 Promise 的 reject 并不会天然进全局错误处理,后面进阶方案里会解决这个问题。


