首页 > 其他分享 >如何处理前端异常报错?

如何处理前端异常报错?

时间:2024-02-18 17:33:52浏览次数:36  
标签:function 前端 window 报错 error 加载 异常 页面

异常分类

  • 页面js报错
  • ajax请求异常
  • 页面资源加载异常(如:加载某个图片资源失败)
  • promise异常
  • iframe加载异常
  • 页面崩溃和卡顿异常

常见的try catch

不能捕获异步的错误。比如这个setTimeout内部的错误捕获不到

    try {
      setTimeout(() => {
        logErrorInfo();// 上报错误
      }, 1000);
    } catch (e) {}

处理页面js报错

    window.onerror = function(message,source,lineno,colno,error){
    message:出错误的信息
    source:出错误的文件
    lineno:出错的代码行号
    colno:出错的代码列号
    error:错误的对象,包含错误的具体信息
    }

处理页面资源加载异常

window.addEventListener('error',function(error){
       logErrorInfo()
// 要设置允许冒泡,当资源加载失败后,会触发这个资源的error事件,会向上冒泡,会被window的error事件捕获到
},true) 

promise异常

window.addEventListener('unhandledrejection',function(error){
       logErrorInfo()
})

处理vue异常 -> errHandler

Vue.config.errHandler = (err,vm,info){
       logErrorInfo()
}

处理react异常 -> componentDidCatch

class ErrorBoundat extends React.Compoent{
     componentDidCatch(error , info) {
       logErrorInfo()
  }
}

处理iframe加载异常

    window.frames[0].onerror = function (
      message,
      source,
      lineno,
      colno,
      error
    ) {
      console.log();
      return true;
    };

处理页面崩溃和卡顿异常

    window.addEventListener('load', function () {
      sessionStorage.setItem('good_exit', 'pending');
    });
    window.addEventListener('beforeunload', function () {
      sessionStorage.setItem('good_exit', 'true');
    });
    if (
      sessionStorage.getItem('good_exit') &&
      sessionStorage.getItem('good_exit') !== 'true'
    ) {
      alert('页面异常关闭');
    }

上报方式:

  • 发起一个同步 XMLHttpRequest 来发送数据。或者是一个GET请求或head请求

缺点:1.跨域问题、2.接口挂掉

  • 创建一个 img 元素并设置 src
    function report(error) {
      const reportUrl = 'http://www/baidu.com/report';
      new Image().src = `${reportUrl}?logs=${error}`;
    }

缺点:大部分用户代理会延迟卸载(unload)文档以加载图像。
优点

  • 没有跨域的限制,可以直接发送跨域的GET请求,不用做特殊处理;
  • 兼容性好,一些静态页面可能禁用了脚本,这时script标签就不能使用了;
  • 不需要将其append到文档,只需设置src属性便能成功发起请求。
  • 创建一个几秒的 no-op 循环。
  • navigator.sendBeacon(无阻塞发送统计数据)

Navigator.sendBeacon()

document.addEventListener("visibilitychange", function logData() {
  if (document.visibilityState === "hidden") {
    navigator.sendBeacon("/log", analyticsData);
  }
});
  • 相较于图片的src,这种方式的更有优势:
  • 不会和主要业务代码抢占资源,而是在浏览器空闲时去做发送;
  • 并且在页面卸载时也能保证请求成功发送,不阻塞页面刷新和跳转;

现在的埋点监控工具通常会优先使用sendBeacon,但由于浏览器兼容性,还是需要用图片的src兜底。

localStorage暂存

localStorage暂存也可以通过localStorage暂存数据,等到浏览器空闲的时候上传,上传成功删除本地数据

标签:function,前端,window,报错,error,加载,异常,页面
From: https://www.cnblogs.com/lyly96720/p/18019661

相关文章

  • nvm list available 命令执行异常 Could not retrieve https://npm.taobao.org/mirror
    异常:无法连接镜像地址 解决方法在nvm的安装位置找到文件settings.txt,修改镜像地址修改前 修改后保存再次运行命令 ......
  • 前端衡量页面性能的指标都有哪些?
    以用户为中心的性能指标FirstPaint首次绘制(FP)Firstcontentfulpaint首次内容绘制(FCP)Largestcontentfulpaint最大内容绘制(LCP)Firstinputdelay首次输入延迟(FID)TimetoInteractive可交互时间(TTI)Totalblockingtime总阻塞时间(TBT)Cumulativelayoutshift累......
  • 用python脚本自动发送钉钉消息出现服务器异常的报错: HTTPSConnectionPool(host='oapi.
    一、问题描述执行python脚本发送钉钉消息,出现报错:HTTPSConnectionPool(host='oapi.dingtalk.com',port=443):Maxretriesexceededwithurl:/robot/send?access_token=43df999582e899dc6815c9d6346c9d253060259625c92e4f166e25ea58e5bdb5&timestamp=1708242748918&sign......
  • vue报错: error:0308010C:digital envelope routines::unsupported
    问题解决参考:https://blog.csdn.net/m0_65933139/article/details/130690790问题描述:报错:Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的......
  • MAC DOCKER Zookeeper 启动报错 mkdir /host_mnt/private/var/db/timezone/tz: operat
    在Mac电脑上启动Zookeeper和kafka的docker容器时报错一开始我的语句是这样的dockerpullwurstmeister/zookeeperdockerrun-d--restart=always--log-driverjson-file--log-optmax-size=100m--log-optmax-file=2--namezookeeper-p2181:2181-v/etc/localtime:/et......
  • pandas 缺失值、异常值提取和处理
    forcolumnameindf.columns:#遍历每一列ifdf[columname].count()!=len(df):#判断缺失行条件:所在列的值数等于总数据的长度#将存在缺失值的行的索引转换成列表储存loc=df[columname][df[columname].isnull().values==True].index.tolist()......
  • Vue.js前端框架之vite+vue+naive前端项目模板
    1.搭建Vue示例项目npmcreatevue cdvue-demo:进入项目目录npminstall:安装所有依赖npmrundev:启动项目2.了解Vue开发和工作原理2.1package.json类似于Python项目中pyproject.toml,包含了项目名称、版本、命令、依赖、设定2.2index.html浏览器访问到的HTML文件 ......
  • .NET 8 中 使用 IFormFile 上传大文件报错解决方案
    前言:项目中使用IFormFile写了一个上传文件的api,测试小文件时正常,当上传大文件(几十兆)时如下报错:使用默认的http启动,如下提示使用IIS启动,如下报错Error:RequestEntityTooLarge原因:.NET官方出于安全考虑,对body的大小做了限制,超出了限制就会form转化失败,导致我们Reuest.......
  • 【Vue前端】vue使用笔记0基础到高手第2篇:Vue进阶知识点介绍(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论vue相关知识。Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API。Vue.js是一个构建数据驱动......
  • VSCOde+Nodejs+Typescript前端开发环境
    1.安装Node.js下载地址:https://nodejs.org/enlts版本:长久稳定版本安装:默认安装就可以了验证:node2.VSCode下载地址:https://code.visualstudio.com/Download安装:默认安装语言切换:安装中文插件,重启 2.1修改终端cmd模式:1.点击设置图标,选择CommandPalette 2.输入:Ter......