JavaScript代碼異常監(jiān)控實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了JavaScript代碼異常監(jiān)控實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
JavaScript異常一般有兩方面:語(yǔ)法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。兩種錯(cuò)誤的捕獲和處理方式不同,從而影響具體的方案選型。通常來(lái)說(shuō),處理JS異常的方案有兩種:try...catch捕獲 和 window.onerror捕獲。以下就兩種方案分別分析各自的優(yōu)劣。
雖然語(yǔ)法錯(cuò)誤本應(yīng)該在開(kāi)發(fā)構(gòu)建階段使用測(cè)試工具避免,但難免會(huì)有馬失前蹄部署到線上的時(shí)候。
try...catch捕獲
這種方案要求開(kāi)發(fā)人員在編寫(xiě)代碼的時(shí)候,在預(yù)估有異常發(fā)生的代碼段使用try...catch,在發(fā)生異常時(shí)將異常信息發(fā)送給接口:
try{ //可能發(fā)生異常的代碼段 }catch(e){ //將異常信息發(fā)送服務(wù)端 }
try...catch的優(yōu)點(diǎn)是可以細(xì)化到每個(gè)代碼塊,并且可以自定義錯(cuò)誤信息以便統(tǒng)計(jì)。
具體到上文提到的兩種js異常,try...catch無(wú)法捕獲語(yǔ)法錯(cuò)誤,當(dāng)遇到語(yǔ)法錯(cuò)誤時(shí),瀏覽器仍然會(huì)拋出錯(cuò)誤Uncaught SyntaxError,但是不會(huì)被捕獲,不會(huì)走進(jìn)catch的代碼塊內(nèi)。
另外,如果try代碼塊中有回調(diào)函數(shù)也不會(huì)被捕獲,比如:
try{ var btn = $('#btn'); btn.on('click',function(){ //throw error }); }catch(e){}
上述代碼中btn的監(jiān)聽(tīng)函數(shù)里拋出的異常無(wú)法被外層的catch捕獲到,必須額外套一層:
try{ var btn = $('#btn'); btn.on('click',function(){ try{ //throw error }catch(e){} }); }catch(e){}
綜上所述,try...catch方案的部署非常復(fù)雜,如果人工部署除了要求巨量的工作量,還跟開(kāi)發(fā)人員的能力和經(jīng)驗(yàn)有關(guān)。如果依賴(lài)編譯工具部署(比如fis),那每個(gè)代碼塊都套一層try...catch也是非常難看的并且容易引發(fā)一些不可預(yù)估的問(wèn)題。
window.onerror捕獲
這種方式不需要開(kāi)發(fā)人員在代碼中書(shū)寫(xiě)大量的try...catch,通過(guò)給window添加onerror監(jiān)聽(tīng),在js發(fā)生異常的時(shí)候便可以捕獲到錯(cuò)誤信息,語(yǔ)法異常和運(yùn)行異常均可被捕獲到。但是window.onerror這個(gè)監(jiān)聽(tīng)必須放在所有js文件之前才可以保證能夠捕獲到所有的異常信息。
window.onerror事件的詳細(xì)信息參考這里。
/** * @param {String} errorMessage 錯(cuò)誤信息 * @param {String} scriptURL 出錯(cuò)文件的URL * @param {Long} lineNumber 出錯(cuò)代碼的行號(hào) * @param {Long} columnNumber 出錯(cuò)代碼的列號(hào) * @param {Object} errorObj 錯(cuò)誤信息Object */ window.onerror = function(errorMessage, scriptURL, lineNumber,columnNumber,errorObj) { // code.. }
onerror的實(shí)現(xiàn)方式各瀏覽器略有差異,但是前三個(gè)參數(shù)都是相同的,某些低版本瀏覽器沒(méi)有后兩個(gè)參數(shù)。
最后一個(gè)參數(shù)errorObj各瀏覽器實(shí)現(xiàn)的程度不一致,具體可參考這里。
下圖是被onerror捕獲到的一個(gè)異常的具體信息:
綜上所述,window.onerror方案的優(yōu)點(diǎn)是減少了開(kāi)發(fā)人員的工作量,部署方便,并且可以捕獲語(yǔ)法錯(cuò)誤和運(yùn)行錯(cuò)誤。缺點(diǎn)是錯(cuò)誤信息不能自定義,并且errorObj每種瀏覽器的實(shí)現(xiàn)有略微差異,導(dǎo)致需統(tǒng)計(jì)的信息有局限性。
跨域JS文件異常的捕獲
為了提高web性能,目前大部分web產(chǎn)品架構(gòu)中都有CDN這一環(huán),將資源部署到不同的域名上,充分利用瀏覽器的并發(fā)請(qǐng)求機(jī)制。那么在跨域JS文件中發(fā)生異常的時(shí)候,onerror監(jiān)聽(tīng)會(huì)捕獲到什么信息呢?請(qǐng)看下圖:
只有一個(gè)稍微有價(jià)值的信息Script error,其他什么信息都沒(méi)有,為什么會(huì)這樣呢?
我們都知道瀏覽器有同源資源限制,常規(guī)狀態(tài)下是無(wú)法進(jìn)行跨域請(qǐng)求的。而script、img、iframe標(biāo)簽的src屬性是沒(méi)有這種限制的,這也是很多跨域方案的基礎(chǔ)。但是即使script標(biāo)簽可以請(qǐng)求到異域的js文件,此文件中的信息也并不能暴露到當(dāng)前域內(nèi),這也是瀏覽器的安全措施所致。
那么有沒(méi)有辦法獲取到異域資源的異常信息呢?
其實(shí)很簡(jiǎn)單,目前可以說(shuō)基本上所有的web產(chǎn)品對(duì)于js/css/image等靜態(tài)資源都在服務(wù)端設(shè)置了Access-Control-Allow-Origin: *的響應(yīng)頭,也就是允許跨域請(qǐng)求。在這個(gè)環(huán)境下,只要我們?cè)谡?qǐng)求跨域資源的script標(biāo)簽上添加一個(gè)crossorigin屬性即可:
<script src="http://static.toutiao.com/test.js" crossorigin></script>
這樣的話,異域的test.js文件中發(fā)生異常時(shí)便可以被當(dāng)前域的onerror監(jiān)聽(tīng)捕獲到詳細(xì)的異常信息。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js技巧之十幾行的代碼實(shí)現(xiàn)vue.watch代碼
相信很多的用vue的人都知道vue雙向綁定的原理建立在,給屬性綁定了getter和setter,在屬性被改變的同時(shí)觸發(fā)視圖的再渲染。而本期也是借助這兩個(gè)內(nèi)置方法實(shí)現(xiàn)vue內(nèi)的watch2018-06-06JavaScript defineProperty如何實(shí)現(xiàn)屬性劫持
雙向數(shù)據(jù)綁定的核心方法,主要是做數(shù)據(jù)劫持操作(監(jiān)控?cái)?shù)據(jù)變化),下面這篇文章主要給大家介紹了關(guān)于JavaScript defineProperty如何實(shí)現(xiàn)屬性劫持的相關(guān)資料,需要的朋友可以參考下2021-07-07詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題
這篇文章主要介紹了詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題,有需要的朋友可以了解一下。2016-11-11JS實(shí)現(xiàn)點(diǎn)擊按鈕控制Div變寬、增高及調(diào)整背景色的方法
這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊按鈕控制Div變寬、增高及調(diào)整背景色的方法,涉及javascript動(dòng)態(tài)操作頁(yè)面元素屬性的相關(guān)技巧,適用于動(dòng)態(tài)更換頁(yè)面皮膚的功能,需要的朋友可以參考下2015-08-08Javascript實(shí)現(xiàn)登錄框拖拽效果
這篇文章主要為大家詳細(xì)介紹了Javascript實(shí)現(xiàn)登錄框拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10JS實(shí)現(xiàn)購(gòu)物車(chē)中商品總價(jià)計(jì)算
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)購(gòu)物車(chē)中商品總價(jià)的計(jì)算 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03JS數(shù)組方法concat()用法實(shí)例分析
這篇文章主要介紹了JS數(shù)組方法concat()用法,結(jié)合實(shí)例形式分析了JS數(shù)組concat()方法具體功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-01-01點(diǎn)擊button獲取text內(nèi)容并改變樣式的js實(shí)現(xiàn)
這篇文章主要介紹了點(diǎn)擊button獲取text內(nèi)容并改變樣式的js實(shí)現(xiàn),經(jīng)測(cè)試非常實(shí)用,需要的朋友可以參考下2014-09-09微信小程序?qū)崿F(xiàn)下拉刷新動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了微信小程序動(dòng)畫(huà)實(shí)現(xiàn)下拉刷新動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06如何實(shí)現(xiàn)iframe(嵌入式幀)的自適應(yīng)高度
[紅色]如何實(shí)現(xiàn)iframe(嵌入式幀)的自適應(yīng)高度...2006-07-07