it编程 > 编程语言 > Javascript

前端监控页面异常的常用方法

2人参与 2025-04-24 Javascript

前端开发常见问题之一: 资源异常、js异常;

页面出了问题常见的想法是:如何看到错误信息,资源脚本是否正常;

像js、css、图片这些资源文件经常受网络等原因,导致资源加载异常,这些会直接影响我们的页面; 所以我们也需要有对资源加载是否正常有监控;

1.资源加载错误监控

这块主要是对资源加载错误,找不到文件或者网络原因导致资源加载超时导致的失败;

常用方法:

该方法是相对比较推荐,因为页面error监听函数可以捕获到页面所有移除信息,只需要自行获取异常信息即可;

参考一个例子

/** * 监控页面静态资源加载报错 */ 
function loadresourceerror() { 
    window.addeventlistener('error', function(e) { 
        console.log(e, '错误捕获==='); 
        if(e){ 
            let target = e.target || e.srcelement; 
            let iselementtarget = target instanceof htmlelement; 
            if (!iselementtarget) { 
                // js错误 
                console.log('js错误==='); 
                // js error处理 
                let { filename, message, lineno, colno, error} = e; 
                let { message: errormsg, stack } = error; 
            }else{ 
                // 页面静态资源加载错误处理 
                console.log('资源加载错误==='); 
                let { type, timestamp, target } = e; 
                let { localname, outerhtml, tagname, src } = target; 
                let typename = target.localname; 
                let sourceurl = ""; 
                if (typename === "link") { 
                    sourceurl = target.href; 
                } else if (typename === "script") { 
                    sourceurl = target.src; 
                } 
                alert('资源加载失败,请刷新页面或切换网络重试。('+sourceurl+')') 
             } 
         } 
        // 注意:由于网络请求异常不会事件冒泡,因此必须在捕获阶段才能捕获到异常;
        // 设为true表示捕获阶段调用,会在元素的onerror前调用,在window.addeventlistener('error')后调用 
       },true); 
} 
   // 我们根据e.target的属性来判断它是link标签,还是script标签。目前只关注只监控了css,js文件加载错误的情况。

运行结果

补充一个知识点:

window.addeventlistener('error') 与 window.onerror 有什么区别?

window.addeventlistener('error') 和 window.onerror 都是用来捕获全局错误的方法,但它们在使用方式、功能特性以及适用场景上有所不同。

定义:

功能:

使用:

可以获取到当前所有加载成功的资源列表。 然后在onload事件中遍历出所有资源集合。 再从所有列表中过滤出成功的资源列表,剩下的就是加载失败的资源;

虽然能排查出一些加载失败的静态资源,但受到检查时机的影响,还有遇到遇到异步加载的js也没有办法处理;

看个例子

// 浏览器获取网页时会对网页中每一个对象(脚本文件、样式表、图片文件等等)发出一个http请求。而通过window.performance.getentries方法,则可以以数组形式,返回这些请求的时间统计信息,每个数组成员均是一个performanceresourcetiming对象! 
//原理是通过捕获浏览器发出的http请求信息
function performancegetentries(){ 
    // 判断浏览器是否支持 
    if (!window.performance && !window.performance.getentries) { 
        return false; 
    } 

    var result = []; 
    // 获取当前页面所有请求对应的performanceresourcetiming对象进行分析 
    window.performance.getentries().foreach((item) => { 
        result.push({ 
            'url': item.name, 
            'entrytype': item.entrytype, 
            'type': item.initiatortype, 
            'duration(ms)': item.duration 
         }); 
    }); 
    // 控制台输出统计结果 
    console.table(result); // 表示已经加载的资源  -这是加载成功的列表
    
   //一个最简单的方法是数量相差得出失败的数量
   // 然后把整个资源的数量减去已经加载好的资源,剩下的就是没有加载出来的资源的数量。 
}

运行效果

指定具体的静态资源,如某个图片元素

图片:
let image = document.getelementbyid('#img')
image.onerror = (e)=>{
    //错误信息
    console.log(e)
}

js脚本
let script = document.createelement('script');
script.onload = function() {
    console.log('脚本加载成功');
    // 脚本加载成功后的操作
};
script.onerror = function() {
    console.error('脚本加载失败');
    // 脚本加载失败后的操作
};

2. js逻辑异常

直接用try catch获取js错误信息和上报

在可能抛出异常的代码块使用try……catch结构,可以捕获并处理这些错误;

try {
    // 尝试执行的代码
    somefunctionthatmightthrow();
} catch (error) {
    // 错误处理
    console.error('捕获到错误:', error);
    reporterror(error); // 自定义的错误上报函数
}

为整个javascript环境添加全局错误监听器,可以捕获未被捕获的异常。即 window.onerror方法, 由于上面已经介绍过,这里就重复介绍;

window.onerror = function(message, source, lineno, colno, error) {
    console.error('全局错误捕获:', message, '在', source, '行', lineno);
    reporterror(message, source, lineno); // 自定义的错误上报函数
    return false; // 返回false阻止默认的错误页面显示
};

使用window.addeventlistener监听捕获异常,上面已经介绍过,这里就不重复介绍;

window.addeventlistener('error', function(event) {
    var message = event.message;
    var filename = event.filename || event.filename;
    var lineno = event.lineno;
    var colno = event.colno;
    var error = event.error; // error object if available
 
    console.error('未捕获的异常:', message, '在', filename, '行', lineno);
    reporterror(message, filename, lineno); // 自定义的错误上报函数
}, true); // 使用capture参数为true来捕获事件冒泡阶段的事件

总结

前端监控页面异常设计的时候,可以考虑:1.window.addeventlistener ;2.window.onerror;

都可以覆盖资源加载异常和业务逻辑异常

到此这篇关于前端监控页面异常的常用方法的文章就介绍到这了,更多相关前端监控页面异常内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Vue使用iframe实现浏览器打印兼容性优化

04-24

Vue3实现挂载全局方法和用getCurrentInstance代替this

04-24

使用Vue开发登录页面的完整指南

04-24

Vue3中Slot插槽透传,二次封装Arco的table组件详解

04-24

在Vue项目中引入Echarts绘制K线图的方法技巧

04-24

vue3如何解决slot深层透传问题

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论