优雅处理前端异常

一、为什么要处理异常?

1 增强用户体验
2 远程定位问题
3 未雨绸缪 发现问题
4 无法浮现问题 尤其是移动端 机型 系统都是问题
5 完善的前端方案 前端监控系统

二、需要处理哪些异常

1、js预发错误 代码异常
2、ajax请求异常
3、静态资源家在异常
4、promise异常
5、iframe异常
6、跨域script error
7、崩溃和卡顿

Try-Catch的误区

try-catch只能捕获同步的运行时错误。对语法和异步的错误无能为力,捕获不到。
1、同步运行时错误

image

2、不能捕获具体的语法错误,只有一个语法错误提示

image

3、异步错误

image

异步异常 捕获不到

四、window.onerror不是万能的

当js运行时错误发生时,window会触发一个ErrorEvent接口的error事件,并执行window.onerror

/**
message: 错误信息
source: 出错文件
lineno: 行号
error: 错误对象
*/
window.onerror = function(message, source, lineno, colno, error){
   console.log('异常捕获', {message, source, lineno, colno, error})
}

1、同步信息错误

image

2、语法错误

image

3、模拟异步运行时的错误

setTimeout(() => {
  michael
}, 3000)

image

补充一点:window.onerror 函数只有返回true的时候,异常才不会向上抛出,否则控制台还是会显示Uncaught Error: XXXXXXXX

注意:
onerror最好写在所有的js脚本的前面,否则有可能捕获不到错误。
onerror无法捕获语法错误

五、winodw.addEventListener 静态资源加载异常

当资源加载失败,加载资源的元素会触发一个Event接口的error事件,并执行该元素上的onerror处理函数

window.addEventListener('error', function(error){
  console.log('捕获到异常',error)
}, true)

image

六、Promise Catch

primise中使用catch可以获取到异步的error, 但是如果忘了怎么办
解决方案:为了防止有漏掉的Promise异常,建议在全局增加一个对unhandlerejection的监听,用来全局监听 Uncaught Promise Error

window.addEventListener('unhandledrejection', function(e) {
  e.preventDefault()
  console.log(e)
  return true
})
Promise.reject('error')

image

七、vue errorHandler

Vue.config.errorHandler = (err, vm, info) => {
   console.error('通过vue errorHandler捕获的错误');
   console.error(err);
   console.error(vm);
   console.error(info);
}

八、react中异常捕获

componentDidCatch(error, info){

}

注意点:error boundaries并不会捕获下面错误
1、事件处理器
2、异步代码
3、服务端的渲染代码
4、在error boundaries区域内的错误

九、iframe异常

<iframe src="./frame.html"></iframe>
window.frames[0].onerror = function(message, source, lineno, colno, error){
  console.log('异常', { message, source, lineno, colno, error })
  return true
}

十、Script error

基本上跨域问题

十一、崩溃和卡顿

利用window对象的load和beforeunload事件实现了网页崩溃的监控。

window.addEventListener('load', function(){
  sessionStorage.setItem('good_exit', 'pending')
  setInterval(function(){
    sessionStorage.setItem('time_before', new Date().toString())
  }, 1000)
})

window.addEventListener('beforeunload', function(){
  sessionStorage.setItem('good_exit', 'true')
})

if(sessionStorage.getItem('good_exit') && sessionStorage.getItem('good_exit') !== 'true'){
    alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash'))
}

2、基于以下原因,我们可以使用 Service Worker 来实现网页崩溃的监控:
Service Worker 有自己独立的工作线程,与网页区分开,网页崩溃了,Service Worker 一般情况下不会崩溃;Service Worker 生命周期一般要比网页还要长,可以用来监控网页的状态;网页可以通过 navigator.serviceWorker.controller.postMessage API 向掌管自己的 SW 发送消息。

知乎上关于service work来监控的方案

十二 错误上报

1、通过ajax 风险:ajax本身也有报错风险,跨域问题
2、动态创建img标签的形式

function report(error){
  let url = 'http://www.baicuu.com'
  new Image().src = `${url}?logs=${error}`
}

收集信息太多怎么办?如何减少服务器的压力

Report.send = function(data){
   if(Math.random < 0.3) {
    send(data)
  }
}

视情况定,用户特征等等

十三 总结

如何优雅的处理异常
1、可疑区增加try-catch
2、全局监控js异常
3、全局监控静态资源异常 window.addEventListener
4、
5、
6、监控网页崩溃:window对象的load 和 beforeunload
7、跨域crossOrigin
分类型解决异常

https://mp.weixin.qq.com/s/prf-mXexBh1Ie-ctq9FnzA

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

推荐阅读更多精彩内容