優(yōu)雅處理前端異常

一沸久、為什么要處理異常季俩?

1 增強(qiáng)用戶體驗(yàn)
2 遠(yuǎn)程定位問題
3 未雨綢繆 發(fā)現(xiàn)問題
4 無法浮現(xiàn)問題 尤其是移動(dòng)端 機(jī)型 系統(tǒng)都是問題
5 完善的前端方案 前端監(jiān)控系統(tǒng)

二挡鞍、需要處理哪些異常

1法褥、js預(yù)發(fā)錯(cuò)誤 代碼異常
2卖氨、ajax請求異常
3、靜態(tài)資源家在異常
4残炮、promise異常
5韭赘、iframe異常
6、跨域script error
7势就、崩潰和卡頓

Try-Catch的誤區(qū)

try-catch只能捕獲同步的運(yùn)行時(shí)錯(cuò)誤泉瞻。對語法和異步的錯(cuò)誤無能為力脉漏,捕獲不到。
1袖牙、同步運(yùn)行時(shí)錯(cuò)誤


同步運(yùn)行時(shí)錯(cuò)誤.png

2侧巨、不能捕獲具體的語法錯(cuò)誤,只有一個(gè)語法錯(cuò)誤提示


這個(gè)錯(cuò)誤基本上沒有啥用.png

3鞭达、異步錯(cuò)誤
image.png

異步異常 捕獲不到

四司忱、window.onerror不是萬能的

當(dāng)js運(yùn)行時(shí)錯(cuò)誤發(fā)生時(shí),window會(huì)觸發(fā)一個(gè)ErrorEvent接口的error事件畴蹭,并執(zhí)行window.onerror

/**
message: 錯(cuò)誤信息
source: 出錯(cuò)文件
lineno: 行號
error: 錯(cuò)誤對象
*/
window.onerror = function(message, source, lineno, colno, error){
   console.log('異常捕獲', {message, source, lineno, colno, error})
}

1坦仍、同步信息錯(cuò)誤


window.error同步信息出錯(cuò).png

2、語法錯(cuò)誤


語法信息錯(cuò)誤.png

3叨襟、模擬異步運(yùn)行時(shí)的錯(cuò)誤
setTimeout(() => {
  michael
}, 3000)
異步錯(cuò)誤.png

補(bǔ)充一點(diǎn):window.onerror 函數(shù)只有返回true的時(shí)候繁扎,異常才不會(huì)向上拋出,否則控制臺(tái)還是會(huì)顯示Uncaught Error: XXXXXXXX

注意:
onerror最好寫在所有的js腳本的前面糊闽,否則有可能捕獲不到錯(cuò)誤梳玫。
onerror無法捕獲語法錯(cuò)誤

五、winodw.addEventListener 靜態(tài)資源加載異常

當(dāng)資源加載失敗右犹,加載資源的元素會(huì)觸發(fā)一個(gè)Event接口的error事件提澎,并執(zhí)行該元素上的onerror處理函數(shù)

window.addEventListener('error', function(error){
  console.log('捕獲到異常',error)
}, true)
image.png

六傀履、Promise Catch

primise中使用catch可以獲取到異步的error, 但是如果忘了怎么辦
解決方案:為了防止有漏掉的Promise異常虱朵,建議在全局增加一個(gè)對unhandlerejection的監(jiān)聽莉炉,用來全局監(jiān)聽 Uncaught Promise Error

window.addEventListener('unhandledrejection', function(e) {
  e.preventDefault()
  console.log(e)
  return true
})
Promise.reject('error')
錯(cuò)誤信息.png

七钓账、vue errorHandler

Vue.config.errorHandler = (err, vm, info) => {
   console.error('通過vue errorHandler捕獲的錯(cuò)誤');
   console.error(err);
   console.error(vm);
   console.error(info);
}

八、react中異常捕獲

componentDidCatch(error, info){
   
}

注意點(diǎn):error boundaries并不會(huì)捕獲下面錯(cuò)誤
1絮宁、事件處理器
2梆暮、異步代碼
3、服務(wù)端的渲染代碼
4绍昂、在error boundaries區(qū)域內(nèi)的錯(cuò)誤

九啦粹、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事件實(shí)現(xiàn)了網(wǎng)頁崩潰的監(jiān)控唠椭。

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 來實(shí)現(xiàn)網(wǎng)頁崩潰的監(jiān)控:
Service Worker 有自己獨(dú)立的工作線程贪嫂,與網(wǎng)頁區(qū)分開,網(wǎng)頁崩潰了艾蓝,Service Worker 一般情況下不會(huì)崩潰力崇;Service Worker 生命周期一般要比網(wǎng)頁還要長斗塘,可以用來監(jiān)控網(wǎng)頁的狀態(tài);網(wǎng)頁可以通過 navigator.serviceWorker.controller.postMessage API 向掌管自己的 SW 發(fā)送消息亮靴。

知乎上關(guān)于service work來監(jiān)控的方案

十二 錯(cuò)誤上報(bào)

1馍盟、通過ajax 風(fēng)險(xiǎn):ajax本身也有報(bào)錯(cuò)風(fēng)險(xiǎn),跨域問題
2茧吊、動(dòng)態(tài)創(chuàng)建img標(biāo)簽的形式

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

收集信息太多怎么辦贞岭?如何減少服務(wù)器的壓力

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

視情況定,用戶特征等等

十三 總結(jié)

如何優(yōu)雅的處理異常
1搓侄、可疑區(qū)增加try-catch
2曹步、全局監(jiān)控js異常
3、全局監(jiān)控靜態(tài)資源異常 window.addEventListener
4休讳、
5讲婚、
6、監(jiān)控網(wǎng)頁崩潰:window對象的load 和 beforeunload
7俊柔、跨域crossOrigin
分類型解決異常

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筹麸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雏婶,更是在濱河造成了極大的恐慌物赶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留晚,死亡現(xiàn)場離奇詭異酵紫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)错维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門奖地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赋焕,你說我怎么就攤上這事参歹。” “怎么了隆判?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵犬庇,是天一觀的道長。 經(jīng)常有香客問我侨嘀,道長臭挽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任咬腕,我火速辦了婚禮欢峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己赤赊,他們只是感情好闯狱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抛计,像睡著了一般哄孤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹截,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天瘦陈,我揣著相機(jī)與錄音,去河邊找鬼波俄。 笑死晨逝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懦铺。 我是一名探鬼主播捉貌,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冬念!你這毒婦竟也來了趁窃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤急前,失蹤者是張志新(化名)和其女友劉穎醒陆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裆针,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刨摩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了世吨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡刹。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖另假,靈堂內(nèi)的尸體忽然破棺而出像屋,到底是詐尸還是另有隱情,我是刑警寧澤边篮,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奏甫,受9級特大地震影響戈轿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阵子,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一思杯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦色乾、人聲如沸誊册。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽案怯。三九已至,卻和暖如春澎办,著一層夾襖步出監(jiān)牢的瞬間嘲碱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工局蚀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦锯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓琅绅,卻偏偏與公主長得像扶欣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子千扶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348