Vue 添加异步错误捕获机制是否必要、可行?怎么 Hack?

发布于 2022-09-06 07:57:00 字数 1302 浏览 16 评论 0

对于前端的错误处理,Vue 提供了 Vue.config.errorHandler 的错误全局收集机制,我们可以写一个全局错误处理器 GlobalHandler,在业务内处理业务内错误,其他错误直接抛出,由全局处理器处理,十分便利。

Vue.config.errorHandler 不支持捕获异步错误,于是对于网络请求等异步逻辑的错误我们只能主动将错误送到 GlobalHandler:

GlobalHandler

这种实现是没有问题的:

HandleAsyncError

但不够优雅,因为业务中大部分内容是没有特殊处理逻辑的,有错直接抛到全局,也就是说,有大量没必要的 try catch:

UselessTryCatch

UselessTryCatchs

如果 Vue 能捕获异步错误,编写 async / await 异步函数的代码将能够更加简练,读写效率都能有所提升。

解决方案方面,想到了一种:在 Vue 实例初始化的时候,判断函数是否异步函数,将所有异步函数再封装一层,调用后劫持 Promise:

PromiseHijack

能力有限,无法判断这个改动会带来多大的影响,是否可行?有什么更优雅的实现方式?

如果用插件实现该从什么地方入手 hack 到实例初始化函数?

请各倾陆海

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

情绪操控生活 2022-09-13 07:57:01

我感觉你的方法已经很高端了,异步的异常一般都只能自己try-catch,这和promise的机制有关

不知所踪 2022-09-13 07:57:01

在Vue 中,我使用window.onerror进行捕获异常,但是所有的捕获信息都为Script Error,但在jquery的代码能正常,不知道为啥

安稳善良 2022-09-13 07:57:01

大神,wrap这段代码怎么去调用呐?

天煞孤星 2022-09-13 07:57:00

我觉得你的处理方法挺好。如果担心引起一些不可预料的问题,可以考虑采用主动封装的方式,比如

Vue.prototype.$await = async function(action) {
    try {
        await action();
    } catch (err) {
        // 这里是你处理错误的逻辑
        console.log("Cought Error: ", err);
    }
};

然后在 methods 中定义方法时:

doSomething(...args) {
    this.$await(async () => {
        await asyncDealWith(...args);
    });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文