最新要闻
- 环球关注:iPhone开始在俄罗斯遭禁用了:不安全!苹果此前已在该国停售
- 焦点快看:填补空白!中国将首次开启海上二氧化碳封存
- Wii U和3DS在线游戏商店关闭前:玩家花15万328天买下所有游戏
- 2022年 全国坐火车的少了36.4%!高铁已达4.2万公里
- 日本东电直播用核污水养鱼 海外网友直言:留着自己吃吧
- 环球热点评!旗舰级LCD护眼屏+120W独此一款!iQOO Z7发布:1599元
- 全球热议:6000mAh同档位续航无敌!iQOO Z7x发布:1299元起
- 便宜卡终于有了!好队友抢跑:RTX 4070/4060来也
- 9999元 AOC爱攻新款48寸显示器上架:4K OLED屏、138Hz高刷
- 当前快讯:死亡细胞将登陆Android端
- 【世界新视野】抗早泄药物盐酸达泊西汀国内正式上市:效果最好!订单超4000万元
- 天天通讯!1994《小美人鱼》vs2023《小美人鱼》对比图火了:5月上映 你会看吗?
- 焦点消息!LCD党最好的选择!iQOO Z7定制旗舰级LCD屏:超级护眼
- 今日热闻!神秘光点划过美国加州夜空 专家:或为日本太空垃圾
- 【世界新要闻】正式签约石墨烯之父 超威电池三大单品发布
- 网传凯迪拉克中控屏行驶中弹窗广告 车主:烦死了
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Vue——vue2错误处理收集【七】
(相关资料图)
前言
在initEvents
中发现的有意思的东西,就是 Vue 针对 Error 的处理,说实话之前压根没在意过 Vue 是如何收集处理 Error 的;
errorHandler:https://v2.cn.vuejs.org/v2/api#errorHandler
?> 从 2.2.0 起,这个钩子也会捕获组件生命周期钩子里的错误。同样的,当这个钩子是 undefined 时,被捕获的错误会通过 console.error 输出而避免应用崩溃。
?> 从 2.4.0 起,这个钩子也会捕获 Vue 自定义事件处理函数内部的错误了。
?> 从 2.6.0 起,这个钩子也会捕获 v-on DOM 监听器内部抛出的错误。另外,如果任何被覆盖的钩子或处理函数返回一个 Promise 链 (例如 async 函数),则来自其 Promise 链的错误也会被处理。
内容
error.ts
位于src/core/util/error.ts
?> 整体的函数调用流程如下图,当然这只是一般情况下的流程,也存在handleError
为入口的情况; 具体的内部细节逻辑就直接来看代码吧。
invokeWithErrorHandling
export function invokeWithErrorHandling( handler: Function, context: any, args: null | any[], vm: any, info: string) { let res // 通过try catch进行错误的捕获,如果捕获到错误就调用handleError函数 try { // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call // call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组 // 如果存在args则通过apply进行处理或者通过call进行处理 res = args ? handler.apply(context, args) : handler.call(context) // 如果存在res & res不是vue实例 & res是个promise函数 & res._handled不为true if (res && !res._isVue && isPromise(res) && !(res as any)._handled) { res.catch(e => handleError(e, vm, info + ` (Promise/async)`)) // issue #9511 // avoid catch triggering multiple times when nested calls // 将_handled设置为true避免在嵌套函数中多次触发catch ;(res as any)._handled = true } } catch (e: any) { handleError(e, vm, info) } return res}
handleError
export function handleError(err: Error, vm: any, info: string) { // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. // See: https://github.com/vuejs/vuex/issues/1505 // 处理错误的时候停止deps跟踪防止无限渲染 pushTarget() try { if (vm) { let cur = vm // 循环查找$parent直到查找到vue根实例上,因为根实例上不存在$parent也就是undefined while ((cur = cur.$parent)) { // 获取钩子errorCaptured const hooks = cur.$options.errorCaptured if (hooks) { for (let i = 0; i < hooks.length; i++) { try { // 如果errorCaptured返回的为false直接return const capture = hooks[i].call(cur, err, vm, info) === false if (capture) return } catch (e: any) { // https://v2.cn.vuejs.org/v2/api/#errorCaptured // 执行errorCaptured发生错误时调用globalHandleError // 在捕获一个来自后代组件的错误时被调用。 // 此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。 globalHandleError(e, cur, "errorCaptured hook") } } } } } // 全局的捕获 globalHandleError(err, vm, info) } finally { popTarget() }}
globalHandleError
function globalHandleError(err, vm, info) { // https://v2.cn.vuejs.org/v2/api/#errorHandler // 如果全局配置存在.errorHandler则调用errorHandler输出错误信息 // 没配置的话在浏览器环境下会通过console.error打印错误 if (config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e: any) { // if the user intentionally throws the original error in the handler, // do not log it twice // 如果通过errorHandler处理发生了错误,就直接抛出防止错误被二次打印 if (e !== err) { logError(e, null, "config.errorHandler") } } } logError(err, vm, info)}
logError
// 输出错误信息function logError(err, vm, info) { // DEV环境下直接发出警告 if (__DEV__) { warn(`Error in ${info}: "${err.toString()}"`, vm) } // 如果是浏览器环境下且console不为undefined // 就直接console.error输出错误信息 // 否则就抛出 /* istanbul ignore else */ if (inBrowser && typeof console !== "undefined") { console.error(err) } else { throw err }}
完整源码
import config from "../config"import { warn } from "./debug"import { inBrowser } from "./env"import { isPromise } from "shared/util"import { pushTarget, popTarget } from "../observer/dep"export function handleError(err: Error, vm: any, info: string) { // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. // See: https://github.com/vuejs/vuex/issues/1505 // 处理错误的时候停止deps跟踪防止无限渲染 pushTarget() try { if (vm) { let cur = vm // 循环查找$parent直到查找到vue根实例上,因为根实例上不存在$parent也就是undefined while ((cur = cur.$parent)) { // 获取钩子errorCaptured const hooks = cur.$options.errorCaptured if (hooks) { for (let i = 0; i < hooks.length; i++) { try { // 如果errorCaptured返回的为false直接return const capture = hooks[i].call(cur, err, vm, info) === false if (capture) return } catch (e: any) { // https://v2.cn.vuejs.org/v2/api/#errorCaptured // 执行errorCaptured发生错误时调用globalHandleError // 在捕获一个来自后代组件的错误时被调用。 // 此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。 globalHandleError(e, cur, "errorCaptured hook") } } } } } // 全局的捕获 globalHandleError(err, vm, info) } finally { popTarget() }}export function invokeWithErrorHandling( handler: Function, context: any, args: null | any[], vm: any, info: string) { let res // 通过try catch进行错误的捕获,如果捕获到错误就调用handleError函数 try { // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call // call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组 // 如果存在args则通过apply进行处理或者通过call进行处理 res = args ? handler.apply(context, args) : handler.call(context) // 如果存在res & res不是vue实例 & res是个promise函数 & res._handled不为true if (res && !res._isVue && isPromise(res) && !(res as any)._handled) { res.catch(e => handleError(e, vm, info + ` (Promise/async)`)) // issue #9511 // avoid catch triggering multiple times when nested calls // 将_handled设置为true避免在嵌套函数中多次触发catch ;(res as any)._handled = true } } catch (e: any) { handleError(e, vm, info) } return res}function globalHandleError(err, vm, info) { // https://v2.cn.vuejs.org/v2/api/#errorHandler // 如果全局配置存在.errorHandler则调用errorHandler输出错误信息 // 没配置的话在浏览器环境下会通过console.error打印错误 if (config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e: any) { // if the user intentionally throws the original error in the handler, // do not log it twice // 如果通过errorHandler处理发生了错误,就直接抛出防止错误被二次打印 if (e !== err) { logError(e, null, "config.errorHandler") } } } logError(err, vm, info)}// 输出错误信息function logError(err, vm, info) { // DEV环境下直接发出警告 if (__DEV__) { warn(`Error in ${info}: "${err.toString()}"`, vm) } // 如果是浏览器环境下且console不为undefined // 就直接console.error输出错误信息 // 否则就抛出 /* istanbul ignore else */ if (inBrowser && typeof console !== "undefined") { console.error(err) } else { throw err }}
关键词:
-
vue和xml复习
复习JS知识梳理JS定义的位置行内js(事件名=“javascript:js代码"),内部js(),外部js<scripttype=& 39;text javascript
来源: Go 并发编程(一):协程 gorotine、channel、锁
vue和xml复习
Vue——vue2错误处理收集【七】
环球关注:iPhone开始在俄罗斯遭禁用了:不安全!苹果此前已在该国停售
焦点快看:填补空白!中国将首次开启海上二氧化碳封存
C# 探秘如何优雅的终止线程
行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
焦点播报:Spring IOC官方文档学习笔记(十四)之ApplicationContext的其他功能
如何上传一个npm包
中债金融终端上线“货币经纪行情”功能
瑞信风波由股及债 此前已有分析师提示“AT1”风险
Wii U和3DS在线游戏商店关闭前:玩家花15万328天买下所有游戏
2022年 全国坐火车的少了36.4%!高铁已达4.2万公里
环球热点!基于深度学习的口罩检测系统(Python+清新界面+数据集)
【环球新视野】自律|坚持,是因为不喜欢
Java内部类笔记整理
全球快资讯丨永磁同步电机驱动系统—相关方向思考
焦点要闻:HTTP 状态码与课程总结
日本东电直播用核污水养鱼 海外网友直言:留着自己吃吧
环球热点评!旗舰级LCD护眼屏+120W独此一款!iQOO Z7发布:1599元
全球热议:6000mAh同档位续航无敌!iQOO Z7x发布:1299元起
便宜卡终于有了!好队友抢跑:RTX 4070/4060来也
9999元 AOC爱攻新款48寸显示器上架:4K OLED屏、138Hz高刷
当前快讯:死亡细胞将登陆Android端
环球快看点丨波动数列
瑞银收购瑞信意外“引爆”AT1债券市场 对冲基金不计成本抛售避险
【世界新视野】抗早泄药物盐酸达泊西汀国内正式上市:效果最好!订单超4000万元
天天通讯!1994《小美人鱼》vs2023《小美人鱼》对比图火了:5月上映 你会看吗?
焦点消息!LCD党最好的选择!iQOO Z7定制旗舰级LCD屏:超级护眼
今日热闻!神秘光点划过美国加州夜空 专家:或为日本太空垃圾
【世界新要闻】正式签约石墨烯之父 超威电池三大单品发布
世界今热点:Python+selenium安装
全球即时看!【财经分析】“降准”落地利好信用债阶段表现 中期仍需关注多因素扰动风险
网传凯迪拉克中控屏行驶中弹窗广告 车主:烦死了
热点!多益网络:前女高管们利用网络水军造假 导致公司损失5亿元
全球即时看!速干短袖+短裤:骆驼运动套装79元狂促(300元大额券)
戴森空气净化耳机首发体验:6699元图一乐?
美知名媒体曝特斯拉大量负面:自动驾驶测试作假
焦点速看:这些AIGC工具有趣且实用
abc294G
设计原则
观热点:也等你 [表白墙] 发布!
天天即时:泰格医药董事ZHUAN YIN累计减持7.6万股 减持期限届满
【独家焦点】债市日报:3月20日
每日看点!爆火情侣竟不是真人!新版Midjourney效果爆炸 网友:太可怕了
全球即时看!宏碁搞“副业”?推出电动自行车Acer ebii:110公里超长续航
男子2年未办理个税汇算 被查后补税加罚金近10万
世界资讯:梦想和高薪你会如何选择?00后女生10秒拒绝8家公司
Microsoft Project教程_编程入门自学教程_菜鸟教程-免费教程分享
环球热头条丨Source Generator-扩充原有代码
8个不能错过的程序员必备网站,惊艳到我了!!!
即时焦点:瑞信全面减记AT1债券影响扩大 日债收益率午后全线下挫
新动态:令人血压飙升!一SUV高速快车道停车致多车连撞:后果惨烈
【世界播资讯】毕业典礼学校安排学生在操场吃席:画面仪式感拉满
环球焦点!宁德一家利润超韩国三大厂商 韩系电池厂商绝望:高端低端都打不过
全球观热点:《黑暗荣耀》全剧出现119次韩语粗口:韩剧总是那么吵!
观点:腾讯发布2022研发大数据报告:内部研发人员占比高达74%
【MySQL】InnoDB vs MyISAM
etcd 租约、Watch功能、分布式锁的golang实践
天天资讯:【工作动态】以培训促提升——医疗机构药品器械管理规范培训会
全球今头条!农垦系统继续开展带头扩种大豆油料行动
环球观速讯丨终于!清华团队的ChatGPT发布:国人用起来相当友好
网红阿秋将离开香港继续骑行:被盗走的8000元自行车仍未找回
即时焦点:男孩雷克萨斯4S店内开动展车连撞两车 律师:家长、店方都有责任
语音+App远程操控!天猫精灵智能插座探底好价:两件34元
当前播报:韩国40出头新娘人数比20岁还多:初婚男女平均年龄均创新高
【世界新要闻】华为交换机查看配置命令的方法
全球快讯:关于国产项目Apache Kylin 发展历程及背后的那些事
今热点:概率与期望入门
环球最新:通过python3启动WEB的方法传输文件
世界聚焦:chrony客户端发送时间戳随机问题
每日热点:混凝土强度两倍!科学家发明火星建屋材料:太空尘埃、土豆淀粉制成
你觉得是谁?博主称某日系合资品牌即将退出国内市场
要闻:不废话 真低价!途虎养车2023轮胎节启动:几百元能买静音胎
对标ChatGPT!文心一言云服务来了:百度官宣3月27日上线
主场比赛姆巴佩两失单刀:梅西多次妙传被浪费
世界快消息!jvm相关知识
全球观焦点:易基因:DNA甲基化研究的3大前期探索性实验思路|干货系列
全球报道:光大证券:LPR还将继续保持平稳
环球精选!迪士尼回应游客排挤玲娜贝儿演员:将核实处理 网友吐槽饭圈行为
女子骑电动车导航跑上高架一路逆行:不知道不能上高架
sd卡根目录是什么意思?sd卡根目录在哪里打开?
惠普的驱动程序在哪个文件夹?惠普sd驱动怎么下载?
高能少年团许魏洲抱杨紫是哪一期?高能少年团第二季为什么少了两期?
周杰为哪部奥特曼作品中配过音?周杰个人资料和简历
厨师罗拉是哪里人?厨师罗拉个人资料简介
每日精选:汽车脚垫天花板!男子直接在车内铺瓷砖:耐磨还方便打理
【世界速看料】小伙求加薪被拒将老板工程车弃河:松离合跳车、致损失27万
全球微资讯!女子点螺蛳粉外卖吃出整根蚯蚓 商家称其想吃霸王餐
多车企疯狂大降价 德国媒体:中国车市从没这么卷过
天天观天下!特斯拉高速行驶中AP突然关闭 方向盘助力诡异消失
最新资讯:ChatGPT4高分通过数据库系统工程师(DBA)认证
天天速读:瓦斯琪尔的任务_瓦斯琪尔前置任务
全球速读:女子超市遇电动购物车:30分钟5块钱!网友:比公园划船划算
最资讯丨文章抹黑造谣?特斯拉索赔500万元被判胜诉!媒体不服上诉
焦点!一部车骑十年 回顾绿源液冷电机发展史:三年创下吉尼斯世界纪录
交易履约之产品中心实践
天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
【世界热闻】Python工具箱系列(二十七)
python高级用法之命名元组namedtuple