构建 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 ()


