前端错误收集(Vue)

前言

对开发者:为了更快速的定位及解决bug,减少 JS Error 的错误量;
对用户体验:让用户更加流畅的使用我们的产品,减少用户反馈时间,让尽量少的用户遇到这样的场景就把问题修改掉,保证尽量多的用户可以正常使用;
对产品:不断发现产品的问题,提升产品质量。

所以前端错误收集,必不可少。

调研了现存的错误监控方案,现将相关的知识点整理如下

  • JS异常处理的方式
  • vue项目的异常处理
  • 错误上报
  • 常见错误消息
  • 错误监控产品

JS异常处理的方式

前端错误类型:语法错误、运行错误;

语法错误:语法错误不会通过解析器,他会被标记为非法的JS并报告在控制台中。
看一下这个代码,却少右括号,所以是一个语法错误。控制台会打印出Uncaught SyntaxError: missing ) after argument list(…)

var alarm = "Dragons approach!"; 
alert(alarm

运行错误:

alert(alarm);

这段代码是语法正确的,但是在C语言中,alarm是没有定义的,会被报告语法错误,所以静态语言的查错能力提前了,在程序编译的时候就会指出这种错误,但是JS没有这种能力,在解析器尝试运行这段代码的时候,会抛出“run-time error”。

try-catch

通过catch捕获到错误,做一些处理(上报错误)

 try {
        msg
    } catch (e) {
        console.log('catch error!');
        console.log(e)
    }

限制:无法捕获语法、异步错误,但是:可以捕获async await错误

  • 语法错误
 try {
  // 括号未闭合
    console.log('error'
  } catch (e) {
    console.error('try-catch', e);
  }

  • 异步错误
 try {
    setTimeout(() => {
      throw '出错啦!';
    }, 1000)
  } catch (e) {
    console.error(e);
  }

捕获async-await

  function p() {
    let x = new Promise((resolve, reject) => {
      reject('出错啦!')
    })
    return x;
  }

  async function f() {
    try {
      await p();
    } catch (e) {
      console.error('try-catch', e);
    }
  }
  f();

运行结果


window.onerror

优点:可以捕获异步错误

window.onerror=function(errMsg,url,row,col,error){
  console.log({msg, url, row, col, error});
 return true
}

限制:不能捕获资源加载错误错误

<script>
  window.onerror = function (msg, url, row, col, error) {
    console.log({
      msg,  url,  row, col, error
    })
    return true;
  };
</script>
<img src="./404.png">

需要注意的是,window.onerror 函数只有在返回 true 的时候,异常才不会向上抛出,否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx。

addEventListener(error,handle)

优点:除了onerror捕获的错误之外,还可以捕获资源加载错误

    window.addEventListener('error', (e) => {
        console.log(e, e.message)
    },true)

由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,但是这种方式虽然可以捕捉到网络请求的异常,但是无法判断 HTTP 的状态是 404 还是其他比如 500 等等,所以还需要配合服务端日志才进行排查分析才可以。

addEventListener("unhandledrejection",handle)

捕获未catch 的 promise 错误

vue项目的异常处理

vue提供了一个全局配置 errorHandle,,用于收集Vue运行时发生的错误。

Vue.config.errorHandler = function (err, vm, info) {
  // handle error
  // `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子
  // 只在 2.2.0+ 可用
 let componentName = formatComponentName(vm);
}
// 获取组件的名称
  function formatComponentName(vm) {
    if (vm.$root === vm) return 'root';
    let name = vm._isVue
      ? (vm.$options && vm.$options.name) ||
      (vm.$options && vm.$options._componentTag)
      : vm.name;
    return (
      (name ? 'component <' + name + '>' : 'anonymous component') +
      (vm._isVue && vm.$options && vm.$options.__file
        ? ' at ' + (vm.$options && vm.$options.__file)
        : '')
    );
  }

拿到vue对应的实例之后,就可以获取vue对应的组件名称,定位到是哪一个组件报错;

常见错误消息

  • Script error.
    引入与当前不同源的资源,脚本出错时,就报此错误消息;
    解决方案:
    1.同源化
将js代码内联到html文件中
将js文件与html文件放到同一域名下

以上方式能够简单直接地解决问题,但也可能带来其他影响,如内联资源不好利用文件缓存,同域无法充分利用cdn优势等等。
2.跨源资源共享机制( CORS )

<script src="http://127.0.0.1:8077/main.js" crossorigin></script>

服务端也需要支持跨域资源共享

 Access-Control-Allow-Origin:*
  • ResizeObserver loop limit exceeded
    在升级chrome64版本之后会报这个错误,可以忽略这个错误;
    这个是提示你无法在单帧动画所有的observers,不会导致程序中断
    https://segmentfault.com/q/1010000015836349

错误上报

我们的项目实现方案:
请求错误上报的api:上报公司的错误平台,然后通过钉钉机器人向相应人员发送消息。


image.png

钉钉开发者文档:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

error-log

https://github.com/merrylmr/error-log

错误监控产品

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容