前端代码异常监控—window.onerror

DAC8568实战指南:如何用STM32实现8通道DAC精准控制(附代码) 本文提供DAC8568与STM32结合的实战指南,详细解析8通道16位DAC的精准控制方法。内容涵盖硬件连接、SPI配置、驱动层构建、时序调试及多通道同步输出等关键步骤,并附有经过验证的HAL库驱动代码,帮助工程师快速解决实际项目中的通信与输出稳定性问题。 阅读详情

我是开发微信图文页一名普通的码农。近期加班加点上线非常重要的的广告功能:

示例

底部的广告区域有关注公众号的按钮,用户点击之后就会给广告主带来粉丝,给文章所有者带来广告收入。某天,码农心血来潮,想了解一下每篇文章的图片都来自什么域名,于是加了一段统计脚本…
在这里插入图片描述

如此简单的for循环能难得了我,测试啥,直接上线!

投诉来了

下午15:00上完线,下班后突然收到一堆同事电话:我们这边发现广告的关注点不动了,用户好多投诉进来了,看到你15:00上了线,快看看有什么问题!在家VPN简单看了看代码,知道真相后简直无法直视:

上线出错

把变量len误写成l,导致下边的js脚本不执行了!

反思

对于写代码这件事来说,我们几乎不能避免自己出bug。那我们如果能够在用户侧部署监控,看着用户在我们面前“出错”的话,我们就能很快发现问题并及时处理。假如我们能监控到图文页一天异常发生量,我们在发送异常的时候往服务器上报异常信息,服务器就统计出每一分钟异常的总数:

前端代码异常监控曲线示例图1

那我们可以非常直观地看到发生异常的量,例如上图的例子就可以看出,今天跟上周的异常量是吻合的,没有特别的突增或者突减(当然异常减少是我们需要去做到的!但是后边会讲到如用户浏览器的Javascript插件如果运行时出错,也会被我们捕捉到,所以实际上很难把异常数清零)。

上线

如果有了上边的监控,我们能做什么呢?回到15:00,我上线后,后台收到了非常多的异常上报,于是:

前端代码异常监控曲线示例图2

这时候后台发现监控曲线已经偏离7天前(或者昨天)超过一定的百分比(或者数量),立马发短信发微信给负责人,在用户投诉之前,负责人已经知道这个异常现象的发生,只要及时做修复,就可以恢复正常:

前端代码异常监控曲线示例图3

在上线的时候会有一个异常数的飙升,在修复后,异常数恢复到正常范围内。

如何检测前端异常

那剩下的问题就是如何检测前端的异常,先看看刚刚那段代码在浏览器的出错展现:

控制台错误

一般语法错误以及运行时错误,浏览器都会在console里边体现出错误信息,以及出错的文件,行号,堆栈信息。

来到这里,我们要定义一下本文说到的前端代码异常是什么意思。前端代码异常指的是以下两种情况:

  1. JS脚本里边存着语法错误;
  2. JS脚本在运行时发生错误。

有什么方法可以抓到这个错误,有两个方案:

  1. try, catch方案。你可以针对某个代码块使用try,catch包装,这个代码块运行时出错时能在catch块里边捕捉到。
  2. window.onerror方案。也可以通过window.addEventListener(“error”, function(evt){}),这个方法能捕捉到语法错误跟运行时错误,同时还能知道出错的信息,以及出错的文件,行号,列号。

上边只是简单的说了一下方案,我在接下来的2个小节来讨论一下两个方案实现细节。

try,catch

我们可以通过对代码块加入一个try,catch块来抓出错信息:

try-catch-1

从console可以看到,try,catch能够知道出错的信息,并且也有堆栈信息可以知道在哪个文件第几行第几列发生错误。

但是try,catch的方案有2个缺点:

  1. 没法捕捉try,catch块,当前代码块有语法错误,JS解释器压根都不会执行当前这个代码块,所以也就没办法被catch住;
  2. 没法捕捉到全局的错误事件,也即是只有try,catch的块里边运行出错才会被你捕捉到,这里的块你要理解成一个函数块。

关于第一个缺点,我们没有任何解决办法,原因上边说了,但是一般语法阶段我们是能在开发阶段/或者用工具检测到的,于是乎它就被忽略了。

第二个缺点应该怎么理解呢?try, catch只能捕捉到当前执行流里边的运行错误,对于异步回调来说,是不属于这个try,catch块的:

try-catch-2

我们可以怎么去改进这个方案,我利用了uglifyjs的词法语法分析,再uglifyjs最后输出压缩文件的时候往文件块以及function块加入了try,catch,同时为每个块加入编号,这样出错的时候我们在日志里边就能看到是哪个块有问题。

try-catch-3

window.onerror

window.onerror一样可以拿到出错的信息以及文件名、行号、列号,还可以在window.onerror最后return true让浏览器不输出错误信息到控制台。

  • message:错误消息(字符串)。在HTML οnerrοr=""处理程序event(sic!)中可用。
  • source:引发错误的脚本的URL(字符串)
  • lineno:发生错误的行号(数值)
  • colno:发生错误的行的列号(数值)
  • error:错误对象(对象)

window.onerror-1

window.onerror能捕捉到语法错误,但是语法出错的代码块不能跟window.onerror在同一个块(语法都没过,更别提window.onerror会被执行了)

window.onerror-2

只要把window.onerror这个代码块分离出去,并且比其他脚本先执行(注意这个前提!)即可捕捉到语法错误。

window.onerror-3

对于跨域的JS资源,window.onerror拿不到详细的信息,需要往资源的请求添加额外的头部。

window.onerror-4

静态资源请求需要加多一个Access-Control-Allow-Origin头部,同时script引入外链的标签需要加多一个crossorigin的属性。经过这样折腾后一样能获取到准确的出错信息。

最终方案

我们先来比较两个方案各自的特点。

try,catch的方案有如下特点:

  1. 无法捕捉到语法错误,只能捕捉运行时错误;
  2. 可以拿到出错的信息,堆栈,出错的文件、行号、列号;
  3. 需要借助工具把所有的function块以及文件块加入try,catch,可以在这个阶段打入更多的静态信息。

window.onerror的方案有如下特点:

  1. 可以捕捉语法错误,也可以捕捉运行时错误;
  2. 可以拿到出错的信息,堆栈,出错的文件、行号、列号;
  3. 只要在当前页面执行的js脚本出错都会捕捉到,例如:浏览器插件的javascript、或者flash抛出的异常等。
  4. 跨域的资源需要特殊头部支持。

window.onerror的方法要比try,catch方法更加完善,我们允许少量由于插件带来的脚本错误,最后window.onerror实现的方式是:

window.onerror = function(msg,url,line,col,error){
    //没有URL不上报!上报也不知道错误
    if (msg != "Script error." && !url){
        return true;
    }
    //采用异步的方式
    //我遇到过在window.onunload进行ajax的堵塞上报
    //由于客户端强制关闭webview导致这次堵塞上报有Network Error
    //我猜测这里window.onerror的执行流在关闭前是必然执行的
    //而离开文章之后的上报对于业务来说是可丢失的
    //所以我把这里的执行流放到异步事件去执行
    //脚本的异常数降低了10倍
    setTimeout(function(){
        var data = {};
        //不一定所有浏览器都支持col参数
        col = col || (window.event && window.event.errorCharacter) || 0;
 
        data.url = url;
        data.line = line;
        data.col = col;
        if (!!error && !!error.stack){
            //如果浏览器有堆栈信息
            //直接使用
            data.msg = error.stack.toString();
        }else if (!!arguments.callee){
            //尝试通过callee拿堆栈信息
            var ext = [];
            var f = arguments.callee.caller, c = 3;
            //这里只拿三层堆栈信息
            while (f && (--c>0)) {
               ext.push(f.toString());
               if (f  === f.caller) {
                    break;//如果有环
               }
               f = f.caller;
            }
            ext = ext.join(",");
            data.msg = error.stack.toString();
        }
        //把data上报到后台!
    },0);
 
    return true;
};

后话

通过部署代码异常监控之后,不仅仅用以监控平时上线的异常,同时还发现了不少旧有代码的错误。例如以下代码:

src = img.getAttribute("src");
src.indexOf("http://rapheal.sinaapp.com/");

在某些情况下,文章里边的src可能是null,导致这里调用null的indexOf方法发生异常。也检测到微信webview里边的一些客户端抛出的异常,可以进一步让客户端开发的同事去做bug fix。

上线的稳定性不仅仅依托于代码异常的监控,代码异常监控只能监控到你代码的健康性,而很多时候业务的稳定还需要监控一些业务数据,例如昨天有1000个人点击了关注按钮,今天上线后突然变成了300人点击,除非你很清楚你上线的行为是会导致点击数下降,否则我们就应该重新审查这次上线是否存在问题,必要时还应该回退这次上线。

Mac新手必看:nvm安装全攻略(含常见错误解决方案) 本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。 阅读详情

相关推荐

<视觉>——单目相机的标定(简单原理+Opencv实现)

单目相机的标定原理大致如下: 世界坐标到像素坐标的转换。 期间的参数有S尺度因子,内参矩阵K,旋转矩阵R,平移矩阵T,一共八个未知数。 在Opencv中我们可以方便的根据相机拍摄不同位姿的标定板图片来标定相机,从而求得这些参数,从而可以将相机下的坐标和实际的世界坐标联系起来,求取单应性矩阵H 参考: 单目相机综述:写的特别好 https://www.cnblo...

Kano365的博客 1万+

统一监听Vue、React组件报错

errorCaptured监听下级组件的错误,返回false 阻止向上传播errorHandler监听全局Vue组件的错误window.onerror监听其他JS报错,如 异步。

老电影故事的博客 1596

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 434

window.onerror

window.onerror 可以辅助我们收集页面中的js异常信息。 但是如果是第三方js发生异常,且script标签没有加crossorigin属性。虽然依旧会触发异常事件,但是拿不到相应的异常信息只拿到Scripterror. 在相应的报错的外部js加上crossorigin="anonymous"属性就可以获取到相应的错误信息 ...

笋笋的博客 2257

终极版:完美实现在PyQT5或Pyside2中构建无边框圆角阴影窗口,可拖动,阴影随窗口活动状态变化,窗口鼠标拖动改变大小(完美复用)

终极版(完美复用):完美实现在PyQT5或Pyside2中构建无边框圆角阴影窗口,可拖动,阴影随窗口活动状态变化,窗口鼠标拖动改变大小

文野海阳的博客 1668

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 225

JavaScript的异常处理

当 JavaScript 引擎执行 JavaScript 代码时,有可能会发生各种异常,例如是语法异常,语言中缺少的功能,由于来自服务器或用户的异常输出而导致的异常。而 Javascript 引擎是单线程的,因此一旦遇到异常,Javascript 引擎通常会停止执行,阻塞后续代码并抛出一个异常信息,因此对于可预见的异常,我们应该捕捉并正确展示给用户或开发者。Error对象throw 和 Promis

shooke笔记 1262

Deepseek+Word插件:一键搞定论文翻译与润色的学术写作新革命

本文介绍了Deepseek Word插件如何革新学术写作流程,实现论文翻译与润色的一键操作。该插件深度集成于Word环境,能智能完成中英互译、语法修正、术语统一及逻辑优化,显著提升写作效率与文本质量,是研究者的高效AI助手。

weixin_29252171的博客 513

前端监控告警平台原理,及如何捕捉全局错误,异步promise错误,资源错误,vue错误

监控告警平台可以监控并上报我们的网页在运行时发生的错误,那么监控平台的原理是什么呢,本文介绍了前端监控告警平台原理,包括window.onerror,window.addEventListener等方法.及如何捕捉全局错误,异步promise错误,资源错误,vue错误。

weixin_50488897的博客 1684

红外热成像仪原理及应用

目录什么是红外热成像背景介绍热成像技术原理热成像分类红外热成像和夜视仪之间的区别红外热像仪夜视仪红外照明相机对比红外热像仪都能看透什么如何选择制冷型和非制冷型红外热像仪制冷型红外热像仪非制冷型红外热像仪实例对比成像速度空间分辨率灵敏度光谱滤波同步何如选择合适的红外热像仪像素测温范围和被测物温度分辨率空间分辨率温度稳定性热像仪的距离系数比常见热成像仪关键参数量程视场角 (FOV)红外分辨率热灵敏度(NETD)焦距光谱范围精度内置优化分析NTED(热灵敏度)什么是NETD如何测量NETD?NETD如何影响测量?

zhy295006359的博客 2万+

手把手教你学simulink(32.1)--汽车电动机管理场景示例:基于Simulink的发动机管理系统中的混合动力车辆能量管理优化

本项目旨在设计和实现一个用于混合动力车辆(Hybrid Electric Vehicle, HEV)的能量管理优化系统(Energy Management Optimization System, EMOS)。通过Simulink进行建模和仿真,确保系统的稳定性和性能。该系统采用了先进的控制策略,如模型预测控制(MPC)、模糊逻辑控制、自适应控制等,以优化燃油经济性、减少排放,并提高驾驶体验。

MHD0815的博客 186

使用window.onerror检测项目的全局错误/网络错误

网页应用build之后,会生成一个dist文件夹,这个文件夹里面有一些js / css/ 图片等文件,一般来说我们部署,就是把这个dist文件夹所有的内容部署到服务器。假设在要跳转之前网络不好,无法加载到b.js,这个时候就会报资源找不到的错误!如果对于这种错误我们不做处理,那用户会点击某个按钮没反应,然后页面卡住了,很影响体验!这个时候我们可以使用 window.onerror 去捕获,然后给个网络错误的提示就会好很多。假设我们当前在A页面,就需要加载a.js ,要跳转到B页面,就需要加载b.js。

有一棵树的博客 765

用 XCO 库一键找出某个 ABAP 类的全部子类

ABAP XCO库子类枚举技术解析 本文介绍了在ABAP项目中如何利用XCO库高效获取类的继承层次结构。传统方法使用CL_ABAP_CLASSDESCR或手动维护映射表存在效率低、易遗漏的问题。新方法通过XCO库的IF_XCO_AO_CLASS接口,可简洁地获取父类的所有子类(包括间接子类)。 核心API链式调用: 获取类句柄:xco_cp_abap=>class() 导航子类集合:subclasses->all 获取结果:get()返回类引用表或get_names()返回类名列表 典型应用场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

前端代码异常监控方案window.onerror

通过部署代码异常监控之后,不仅仅用以监控平时上线的异常,同时还发现了不少旧有代码的错误。 例如以下代码: src = img.getAttribute(“src”); src.indexOf(“http://rapheal.sinaapp.com/”); 在某些情况下,文章里边的src可能是null,导致这里调用null的indexOf方法发生异常。 也检测到微信webview里边的一些客户端抛出的异常,可以进一步让客户端开发的同事去做bug fix。 上线的稳定性不仅仅依托于代码异常的监控,代码异常

皮哥不皮 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

前端异常监控全攻略:4大核心技巧

本文介绍了前端监控中的四种异常捕获方法:1.代码运行时异常通过window.onerror捕获;2.Promise异常通过window.onunhandledrejection监听;3.请求异常通过重写fetch方法并配合onunhandledrejection处理;4.资源加载异常通过元素的onerror事件或全局错误监听处理。文章详细说明了每种异常的具体捕获方式,并提供了原生JS、Vue和React中的实现示例,为前端错误监控提供了全面的技术方案。

xufangfang99的博客 774

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

前端代码异常监控

前言 我是开发微信图文页一名普通的码农。 近期加班加点上线非常重要的的广告功能: 底部的广告区域有关注公众号的按钮,用户点击之后就会给广告主带来粉丝,给文章所有者带来广告收入。 某天,码农心血来潮,想了解一下每篇文章的图片都来自什么域名,于是加了一段统计脚本…. 如此简单的for循环能难得了我,测试啥,直接上线! 投诉来了 下午15:00上

ITX2000的专栏 1319

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

前端异常监控、上报及js压缩代码定位

最近在研究前端异常监控的问题,对查询的资料做了整理汇总,总体如下 一、前端异常监控方式 1. window.onerror 异常处理 window.onerror 无论是异步还是非异步错误,onerr...

qq_37555524的博客 695

前端异常监控实现方案介绍

综述:前端页面是最贴近用户的,异常监控并上报很重要 参考文档:https://cdc.tencent.com/2018/09/13/frontend-exception-monitor-research/ https://juejin.im/post/5b53218cf265da0f9313a3de JS 异常处理 对于 Javascript 而言...

我的博客 1613

前端性能监控方案window.performance 调研(转)

链接地址:https://www.cnblogs.com/sunshq/p/5312231.html 1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控。 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API进行数据统计。 影响代码监控数据的因素有以下几种: 浏览器渲染机制; 浏览器对API的...

weixin_41017246的博客 622

JavaScript异常处理实战

另外也可以通过在打包的时候,在每个合并的文件之间添加几行空格,并相应加上一些注释,这样在定位问题的时候很容易可以知道是哪个文件报的错误,然后再通过一些关键词的搜索,可以快速地定位到问题的所在位置。当你的页面有使用 iframe 的时候,你需要对你引入的 iframe 做异常监控的处理,否则一旦你引入的 iframe 页面出现了问题,你的主站显示不出来,而你却浑然不知。window.onerror 捕获异常能力比 try-catch 稍微强点,无论是异步还是非异步错误,onerror 都能捕获到运行时错误。

qq_41765777的博客 1389

《Promise异常的漏网之鱼:window.onerror失效的底层逻辑》

本文解析了前端监控中window.onerror无法捕获Promise未处理异常的现象。这源于JavaScript中同步与异步错误处理体系的并行设计:window.onerror适用于同步代码的即时错误,依赖当前执行栈和冒泡机制;而Promise异常属于异步任务,在独立的微任务队列中处理,其封装性和事件循环的时间差使其脱离了window.onerror的感知范围。这并非技术疏漏,而是规范对不同错误类型的分工设计,后续通过unhandledrejection事件专门应对,体现了JavaScript在兼容与演进

xy520521的博客 631

前端异常监控

近日腾讯音乐电话面试提到如何监控前端代码报错,涉及 js代码报错,异步报错,图片资源、js资源加载报错,Promise报错如何进行监控统计,答的不够全面,于是仔细研究下。 js代码报错 异步报错 图片请求报错 scriptsrc资源加载报错 Promisereject 或者抛错 JS 异常处理 使用 try...catch... try { w }catch(e){ console.log(e) // ReferenceError: w is not defi...

兰亭古墨 737

前端代码异常日志收集与监控

在复杂的网络环境和浏览器环境下,自测、QA测试以及 Code Review 都是不够的,如果对页面稳定性和准确性要求较高,就必须有一套完善的代码异常监控体系,本文从前端代码异常监控的方法和问题着手,尽量全面地阐述错误日志收集各个阶段中可能遇到的阻碍和处理方案。 ☞ 收集日志的方法 平时收集日志的手段,可以归类为两个方面,一个是逻辑中的错误判断,为主动判断;一个是利用语言给我们提供的捷径

nchu2020的专栏 758

前端异常监控表结构设计_前端异常监控实践

为什么要做前端异常监控bug是不可能被全部测试出来的,由于成本和上线档期的考虑,测试无法做到“面面俱到”,即使时间充裕也总会有这样或那样的bug埋藏在某个角落。此外,一个可靠的前端监控系统还可以化被动为主动,不再被动的等待客服来找,而是在问题出现时开发人员可以第一时间知道并解决。捕获方式可以捕获JavaScript错误的基本方法有以下三个:try…catchwindow.onerror利用Prom...

weixin_42349135的博客 208

前端性能监控方案window.performance

前端性能监控方案window.performance 调研(转) 1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控。 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API进行数据统计。 影响代码监控数据的因素有以下几种: 浏览器渲染机制; 浏览器对API的实现程度,比如performance...

morningsun19的博客 665
上一篇: <picture> 标签——自适应显示不同图片
下一篇: 深入理解vue中的修饰符
喵_美
博客等级 码龄11年 445粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值