Vue 的异常处理机制
最近需要在业务中加一个全局的 filter,filter 会对输入进行验证,用于进行前端监控。其中一个要处理的问题,就是验证失败后如何发送异常日志,这个过程中顺便了解了一下 Vue 的异常处理机制。
errorCaptured
、errorHandler
Vue 提供了两个 API 用于异常的捕获,分别是 errorCaptured 和 errorHandler:
errorCaptured
errorCaptured
是组件的一个钩子函数,用于在组件级别捕获异常。当这个钩子函数返回false
时,会阻止异常进一步向上冒泡,否则会不断向父组件传递,直到 root 组件。errorHandler
errorHandler
是一个全局的配置项,用来在全局捕获异常。例如Vue.config.errorHandler = function (err, vm, info) {}
。
error.js
在 Vue 源码中,异常处理的逻辑放在 /src/core/util/error.js
中:
1 | import config from '../config' |
文件不长,向外暴露了一个 handleError
方法,在需要捕获异常的地方调用。handleError
方法中首先获取到报错的组件,之后递归查找当前组件的父组件,依次调用 errorCaptured
方法。在遍历调用完所有 errorCaptured
方法、或 errorCaptured
方法有报错时,会调用 globalHandleError
方法。
globalHandleError
方法调用了全局的 errorHandler
方法。
如果 errorHan
dler 方法自己又报错了呢?生产环境下会使用 console.error
在控制台中输出。
可以看到 errorCaptured
和 errorHandler
的触发时机都是相同的,不同的是 errorCaptured
发生在前,且如果某个组件的 errorCaptured
方法返回了 false,那么这个异常信息不会再向上冒泡也不会再调用 errorHandler
方法。