優(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請(qǐng)求異常
3定踱、靜態(tài)資源家在異常
4棍潘、promise異常
5、iframe異常
6崖媚、跨域script error
7亦歉、崩潰和卡頓

Try-Catch的誤區(qū)

try-catch只能捕獲同步的運(yùn)行時(shí)錯(cuò)誤。對(duì)語法和異步的錯(cuò)誤無能為力畅哑,捕獲不到鳍徽。
1、同步運(yùn)行時(shí)錯(cuò)誤

image

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

image

3、異步錯(cuò)誤

image

異步異常 捕獲不到

四直秆、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: 行號(hào)
error: 錯(cuò)誤對(duì)象
*/
window.onerror = function(message, source, lineno, colno, error){
   console.log('異常捕獲', {message, source, lineno, colno, error})
}

1圾结、同步信息錯(cuò)誤

image

2瑰剃、語法錯(cuò)誤

image

3、模擬異步運(yùn)行時(shí)的錯(cuò)誤

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

image

補(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

六、Promise Catch

primise中使用catch可以獲取到異步的error, 但是如果忘了怎么辦
解決方案:為了防止有漏掉的Promise異常盅安,建議在全局增加一個(gè)對(duì)unhandlerejection的監(jiān)聽唤锉,用來全局監(jiān)聽 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捕獲的錯(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對(duì)象的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對(duì)象的load 和 beforeunload
7擦耀、跨域crossOrigin
分類型解決異常

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涩堤,隨后出現(xiàn)的幾起案子眷蜓,更是在濱河造成了極大的恐慌,老刑警劉巖定躏,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账磺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痊远,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門氏捞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧聪,“玉大人,你說我怎么就攤上這事液茎〕炎耍” “怎么了辞嗡?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滞造。 經(jīng)常有香客問我续室,道長,這世上最難降的妖魔是什么谒养? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任挺狰,我火速辦了婚禮,結(jié)果婚禮上买窟,老公的妹妹穿的比我還像新娘丰泊。我一直安慰自己,他們只是感情好始绍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布瞳购。 她就那樣靜靜地躺著,像睡著了一般亏推。 火紅的嫁衣襯著肌膚如雪学赛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天吞杭,我揣著相機(jī)與錄音盏浇,去河邊找鬼。 笑死篇亭,一個(gè)胖子當(dāng)著我的面吹牛缠捌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播译蒂,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼曼月,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了柔昼?” 一聲冷哼從身側(cè)響起哑芹,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捕透,沒想到半個(gè)月后聪姿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乙嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年末购,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虎谢。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盟榴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婴噩,到底是詐尸還是另有隱情擎场,我是刑警寧澤羽德,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站迅办,受9級(jí)特大地震影響宅静,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站欺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一姨夹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镊绪,春花似錦匀伏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榄鉴,卻和暖如春履磨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庆尘。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工剃诅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驶忌。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓矛辕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親付魔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聊品,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容