问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

window.onerror的总结

发布网友 发布时间:2022-12-22 04:27

我来回答

1个回答

热心网友 时间:2024-11-26 21:24

最近一直在做前端js错误监控的工作,在不断的打磨和完善中,发现里面还是知识点不少,现在就前端js错误监控做一些笔记和总结

我们知道前端js错误监控主要是利用了window.onerror函数来实现,onerror函数会在页面发生js错误时被调用。

我们可以看到函数正常是可以收集到错误字符串信息、发生错误的js文件,错误所在的行数、列数、和Error对象(里面会有调用堆栈信息等)。

我们只需要把这些信息回传到server端即可,再配合sourcemap的话我们就可以知道是源码中的哪一行出错了,从而实现完美的错误实时监控系统了。然而要完美还是需要做很多工作的。

首先,我们的js文件一般都是和网站不同域的,这是为了提高页面的渲染速度以及架构的可维护性(单独CDN域名,充分利用浏览器http并发数)。这样的js文件中发生错误我们直接监控你会发现你啥信息都收集不到。

实验一:我们的站点是 a.com ,页面中引用了两个js文件,一个是 a.com 域名下的a.js,一个是 b.com 域名下的b.js,我们在a.js文件中添加window.onerror监控,在b.js文件中主动抛出错误

我们可以看到下图的结果,onerror函数拿到的信息是 Script error, a 0 null ,啥卵用都没有,你完全不知道发生了什么错误,哪个文件发生的错误。

这是浏览器所做的安全*措施,当加载自不同域(协议、域名、端口三者任一不同)的脚本中发生语法(?)错误时,为避免信息泄露,语法错误的细节将不会报告,而代之简单的"Script error."

但是我们确实是需要知道发生错误的具体信息啊,不然监控就没有意义了。既然又是类同源*的问题,那肯定是可以通过 CORS 来解决了。

实验二:我们给 b.js 加上 Access-Control-Allow-Origin:* 的response header,后面我们会发现还是没啥变化。

实验三:我们继续给 b.js 加上 crossorigin 属性,发现可以了,想要的信息都收集到了,nice

结论:如果想通过onerror函数收集不同域的js错误,我们需要做两件事:

注意:以上两步缺一不可。实验二告诉我们,如果只是加上 Access-Control-Allow-Origin:* 的话,错误还是无法捕获。如果只加上crossorigin属性,浏览器会报无法加载的错误,如下图

可是。。。
如果你使用sentry的raven.js的话,你会发现你什么都不用做,他依然可以帮你捕获到一些错误的非常具体信息,确实是有点神奇啊,具体怎么做的?关键就是raven源码中的install方法中调用的_instrumentTryCatch函数起了作用,他通过tryCatch的方式wrap了一些关键函数,使得这些函数里的报错能够捕获,_instrumentTryCatch的具体实现原理我们后面再说

其实如果你真的什么都不做,raven也只是能捕获一些异步错误,同步错误还是无法捕获,所以你即使使用了sentry等第三方的错误收集库,你还是需要加上 Access-Control-Allow-Origin:* 和crossorigin属性

参考文献:
GlobalEventHandlers.onerror
What the heck is "Script error"?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
whirlpool如何制热 如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 三年级上册语文记叙文有哪些课文 东南大学打造会“唱歌”录取通知书,你的通知书是什么样? 下辈子我们上天再相遇,希望我们的爱不在是回忆,这首歌的名字�... 做蛋糕为什么蛋黄与蛋清要分离,我们做都没有,还有滴醋起什么作用_百度... 下辈子遇见你表达的感情 求新房落成乔迁对联 要用名字写对联 急求乔迁新居对联,内含男女主人名字 如何免费下载txt电子小说 名家乔迁对联 培训两个领导发言顺序 我想问问熟食店需要什么设备 Z字平面熟食柜台怎么画? 大家好,熟食柜柜台颜色和墙裙一个颜色好看吗?急急急拜托 熟食怎么陈列 武装突袭3验证失败是什么意思 对高中班主任的一句话 给高中班主任的教师节祝福语 具有飞天形象的舞蹈属于 多被告起诉状 手机软件追书神器已经缓存完毕的书如何导出为TXT 智慧中小学电子课本怎么导出 单位法定节假日支付的工资怎么赔偿 又是别人家的!东南大学出了 会唱歌的录取通知书 你的id被占用,是否生成一个新id ...主板电源的电路原理、电路的构成及工作原理PC开机上电过程,求详细说... js为什么报错后就不会执行代码 四川理县凉台沟景区下雪了吗 成都那些地方下雪了 楚雄java培训学校告诉你JavaScript常见的八种编程错误问题? ...四川达古冰川景区下雪了,这一景象是如何形成的? 录取通知书特长怎么写 纯白地什么时候出的 身体不好可以喝中药进行调理吗? 时代少年团小卡在哪里收 天津财经大学珠江学院专升本学费 天津财经大学珠江学院什么时候解封 为何大熊猫这么招人喜欢? 花似梦,水如梦 忘了有多久没有牵你的手 爱你的心依旧为你保留 就算时光匆匆溜走 我还 ... 我心依旧歌曲原唱 我心依旧为你停留,全部都是繁体字