背景
- 你还在为处理Uncaught (in promise) ReferenceError烦恼吗?
- 你还在为捕获异常反复的写try catch吗?
- 你还在为每一个promise写catch吗?
是时候一站式统一处理异常!!!(针对vue项目)
全局异常捕获
Vue.config.errorHandler = function (err, vm, info) { // 指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。 // handle error // `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子 // 只在 2.2.0+ 可用 }
注意:面对异常处理,同步异常和异步异常应该区别对待分别处理。
vue核心源码剖析
通过阅读源码看一下vue是如何将Vue.config.errorHandler接口暴露给使用者。
同步异常处理方案
// 定义异常处理函数,判断用户是否自定义Vue.config.errorHandler,定义则直接调用,未定义执行vue本身异常处理。 function globalHandleError(err, vm, info) { if (Vue.config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e) { logError(e, null, 'config.errorHandler'); } } logError(err, vm, info); } try { // vue正常执行代码被包裹在try内,有异常会调用globalHandleError } catch (e) { globalHandleError(e, vm, '对应信息'); }
异步异常处理方案
// 定义异步异常处理函数,对于自身没有捕获异常的promise统一执行catch function invokeWithErrorHandling( handler, context, args, vm, info ) { var res; try { res = args " (Promise/async)"); }); // 异步代码例如promise可以统一为其定义Promise.prototype.catch()方法。 res._handled = true; } } catch (e) { handleError(e, vm, info); } return res } // 所有的钩子函数调用异常处理函数 function callHook(vm, hook) { var handlers = vm.$options[hook]; // 为所有钩子增加异常处理 var info = hook + " hook"; if (handlers) { for (var i = 0, j = handlers.length; i < j; i++) { invokeWithErrorHandling(handlers[i], vm, null, vm, info); } } }
知识延伸
// vue接口是能处理同步异常以及部分钩子中的异步异常,对于方法中的异常无法有效处理,我们可以仿照源码增加方式中的异步异常处理,避免为每一个promise写catch Vue.mixin({ beforeCreate() { const methods = this.$options.methods || {} Object.keys(methods).forEach(key => { let fn = methods[key] this.$options.methods[key] = function (...args) { let ret = fn.apply(this, args) if (ret && typeof ret.then === 'function' && typeof ret.catch === "function") { return ret.catch(Vue.config.errorHandler) } else { // 默认错误处理 return ret } } }) } })
完整代码
下面是全局处理异常的完整代码,已经封装成一个插件
errorPlugin.js /** * 全局异常处理 * @param { * } error * @param {*} vm */ const errorHandler = (error, vm, info) => { console.error('抛出全局异常') console.error(vm) console.error(error) console.error(info) } let GlobalError = { install: (Vue, options) => { /** * 全局异常处理 * @param { * } error * @param {*} vm */ Vue.config.errorHandler = errorHandler Vue.mixin({ beforeCreate() { const methods = this.$options.methods || {} Object.keys(methods).forEach(key => { let fn = methods[key] this.$options.methods[key] = function (...args) { let ret = fn.apply(this, args) if (ret && typeof ret.then === 'function' && typeof ret.catch === "function") { return ret.catch(errorHandler) } else { // 默认错误处理 return ret } } }) } }) Vue.prototype.$throw = errorHandler } } export default GlobalError
使用
// 在入口文件中引入 import ErrorPlugin from './errorPlugin' import Vue from 'vue' Vue.use(ErrorPlugin)
写在最后
增加全局异常处理有助于
- 提高代码健壮性
- 减少崩溃
- 快速定位bug
资料参考
- github.com/vuejs/vue/b…
- cn.vuejs.org/v2/api/#err…
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 罗大佑1982《之乎者也》无法盗版的青春套装版 [WAV+CUE][1G]
- 曾庆瑜1989-款款柔情[日本东芝版][WAV+CUE]
- Scelsi-IntegraledesquatuorsacordesetTrioacordes-QuatuorMolinari(2024)[24bit-WAV]
- 房东的猫2017-房东的猫[科文音像][WAV+CUE]
- 杨乃文.2016-离心力(引进版)【亚神音乐】【WAV+CUE】
- 群星.2024-珠帘玉幕影视原声带【TME】【FLAC分轨】
- 芝麻龙眼.2008-光阴隧道民歌记录3CD【乡城】【WAV+CUE】
- 谭艳《再度重相逢HQII》头版限量[低速原抓WAV+CUE][549M]
- ABC唱片《蔡琴三十周年纪念版》6N纯银镀膜 [WAV+CUE][1.1G]
- 海来阿木《西楼情歌》开盘母带[WAV+CUE][1.1G]
- TheGesualdoSix-QueenofHeartsLamentsandSongsofRegretforQueensTerrestrialandCele
- 王建杰2011-荣华富贵[喜玛拉雅][WAV+CUE]
- 孙悦2024-时光音乐会[金蜂][WAV+CUE]
- 秦宇子.2020-#YUZI【海蝶】【FLAC分轨】
- 苏有朋.1994-这般发生【华纳】【WAV+CUE】