前端代碼異常監(jiān)控之 - window.onerror

之前在公司時半抱,公司內(nèi)部有一個前端異常監(jiān)控系統(tǒng)脓恕,雖然會用,但是別人寫的窿侈,我一直不理解其中的實現(xiàn)原理炼幔,很慚愧用了那么久,竟然都沒有主動去了解了解其中的原理史简。昨天和一個同事聊天乃秀,他說這個監(jiān)控很簡單,就是用了window.onerror 監(jiān)聽錯誤然后AJAX發(fā)送給后臺圆兵。

跺讯??殉农?刀脏??超凳?愈污??轮傍?暂雹??创夜?杭跪??驰吓?揍魂??

原理這么簡單棚瘟?现斋??偎蘸?庄蹋?所以我決定徹底了解下異常監(jiān)控的一些知識

目前瞬内,實現(xiàn)前端異常監(jiān)控,除了用一些現(xiàn)成的框架限书,如果我們自己去實現(xiàn)虫蝶,可以怎么做?

(1) try-catch

這個方案不推薦倦西。

原因如下:

  • 沒辦法捕捉到全局的錯誤事件能真,只有 try-catch 塊里面運行的錯誤才能被捕獲到。
  • 太麻煩扰柠,不可能每一個地方都用 try-catch粉铐,而且,自己寫的代碼卤档,一般調(diào)試時候就會發(fā)現(xiàn)錯誤蝙泼,還用得著監(jiān)控?劝枣?汤踏?

(2) window.onerror

推薦做法,也是我們目前的做法

我們先來看看這個事件的用法:

/*
 * @param msg{String}:錯誤消息
 * @param url{String}:發(fā)生錯誤頁面的url
 * @param line{Number}:發(fā)生錯誤的代碼行
 */

window.onerror = function(msg, url, line){
   return true // 返回 true 則錯誤消息不顯示在控制臺舔腾,返回 false溪胶,則錯誤消息將會展示在控制臺
}

使用這個方法的前提是,必須把這塊代碼單獨分離出來稳诚,且在所有代碼執(zhí)行之前執(zhí)行哗脖,不然,自己的JS報錯采桃,監(jiān)控代碼還沒執(zhí)行懒熙,頁面就掛了,那還怎么監(jiān)控普办,哈哈哈哈工扎。

onerror 事件還有個好處,外部的加載的JS中出現(xiàn)了錯誤衔蹲,也可以監(jiān)聽得到肢娘,不過前提是這個外部JS文件不跨域

如果遇到外部跨域的JS文件,我們該怎么監(jiān)控呢舆驶?

如果你什么都不做橱健,那么如果跨域文件出現(xiàn)問題,只會返回一個錯誤提示:’Script error‘沙廉。這就蛋疼了拘荡,返回這個有什么用?撬陵?珊皿?

別急网缝,以下方法可以助你順利拿到詳細錯誤信息,來蟋定,跟著我往下看:

HTML5中粉臊,允許本地獲取到跨域腳本的錯誤信息,但有兩個條件:

  1. 跨域腳本的服務(wù)器必須通過 Access-Controll-Allow-Origin 頭信息允許當期域名可以獲取錯誤信息
  2. 當前域名的 script 標簽也必須指明src屬性指定的地址是支持跨域的地址驶兜,也就是 crossorigin 屬性

就像這樣:

<script src="..." crossorigin ></script>

通過這兩個設(shè)置扼仲,讓你的頁面盡情的去捕獲跨域錯誤吧!

可是抄淑,又有人要問了(這些人怎么問題這么多(∩_∩))

怎么用onerror去監(jiān)聽圖片的錯誤屠凶??

這個不難蝇狼,請聽我靜靜分(裝)析(逼):

一般的方案就是阅畴,因為onerror可以監(jiān)聽到圖片異常倡怎,比如圖片缺失迅耘,然后我們再手動為其指定一個默認圖片即可,不過监署,如果這個默認圖片也出錯颤专,那豈不是會造成錯誤一直循環(huán)提示?钠乏?栖秕?

怎么解決這個問題?晓避?

所以簇捍,請看以下代碼:

<img src="..." onerror="noFind();" />

function noFind(event){
    var img = event.srcElement;
    img.src = '...'  // 默認圖片地址
    img.onerror = null;  // 控制不要循環(huán)展示錯誤
}

如果你使用了這段代碼,可以確保不會循環(huán)顯示錯誤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俏拱,一起剝皮案震驚了整個濱河市暑塑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锅必,老刑警劉巖事格,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搞隐,居然都是意外死亡驹愚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門劣纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢捺,“玉大人,你說我怎么就攤上這事癞季〗偻” “怎么了棠耕?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠新。 經(jīng)常有香客問我窍荧,道長,這世上最難降的妖魔是什么恨憎? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任蕊退,我火速辦了婚禮,結(jié)果婚禮上憔恳,老公的妹妹穿的比我還像新娘瓤荔。我一直安慰自己,他們只是感情好钥组,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布输硝。 她就那樣靜靜地躺著,像睡著了一般程梦。 火紅的嫁衣襯著肌膚如雪点把。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天屿附,我揣著相機與錄音郎逃,去河邊找鬼。 笑死挺份,一個胖子當著我的面吹牛褒翰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匀泊,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼优训,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了各聘?” 一聲冷哼從身側(cè)響起揣非,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伦吠,沒想到半個月后妆兑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡毛仪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年搁嗓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱靴。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腺逛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡怀,到底是詐尸還是另有隱情棍矛,我是刑警寧澤安疗,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站够委,受9級特大地震影響荐类,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茁帽,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一玉罐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潘拨,春花似錦吊输、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琅束,卻和暖如春扭屁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狰闪。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工疯搅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留濒生,地道東北人埋泵。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像罪治,于是被迫代替她去往敵國和親丽声。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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