最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript代碼異常監(jiān)控實(shí)現(xiàn)過程詳解

 更新時(shí)間:2020年02月17日 10:30:24   作者:歡樂之家  
這篇文章主要介紹了JavaScript代碼異常監(jiān)控實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了JavaScript代碼異常監(jiān)控實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

JavaScript異常一般有兩方面:語法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。兩種錯(cuò)誤的捕獲和處理方式不同,從而影響具體的方案選型。通常來說,處理JS異常的方案有兩種:try...catch捕獲 和 window.onerror捕獲。以下就兩種方案分別分析各自的優(yōu)劣。

雖然語法錯(cuò)誤本應(yīng)該在開發(fā)構(gòu)建階段使用測試工具避免,但難免會有馬失前蹄部署到線上的時(shí)候。

try...catch捕獲

這種方案要求開發(fā)人員在編寫代碼的時(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無法捕獲語法錯(cuò)誤,當(dāng)遇到語法錯(cuò)誤時(shí),瀏覽器仍然會拋出錯(cuò)誤Uncaught SyntaxError,但是不會被捕獲,不會走進(jìn)catch的代碼塊內(nèi)。

另外,如果try代碼塊中有回調(diào)函數(shù)也不會被捕獲,比如:

try{
var btn = $('#btn');
  btn.on('click',function(){
    //throw error
  });
}catch(e){}

上述代碼中btn的監(jiān)聽函數(shù)里拋出的異常無法被外層的catch捕獲到,必須額外套一層:

try{
var btn = $('#btn');
  btn.on('click',function(){
    try{
      //throw error
    }catch(e){}
  });
}catch(e){}

綜上所述,try...catch方案的部署非常復(fù)雜,如果人工部署除了要求巨量的工作量,還跟開發(fā)人員的能力和經(jīng)驗(yàn)有關(guān)。如果依賴編譯工具部署(比如fis),那每個(gè)代碼塊都套一層try...catch也是非常難看的并且容易引發(fā)一些不可預(yù)估的問題。

window.onerror捕獲

這種方式不需要開發(fā)人員在代碼中書寫大量的try...catch,通過給window添加onerror監(jiān)聽,在js發(fā)生異常的時(shí)候便可以捕獲到錯(cuò)誤信息,語法異常和運(yùn)行異常均可被捕獲到。但是window.onerror這個(gè)監(jiān)聽必須放在所有js文件之前才可以保證能夠捕獲到所有的異常信息。

window.onerror事件的詳細(xì)信息參考這里

/**
 * @param {String} errorMessage  錯(cuò)誤信息
 * @param {String} scriptURL   出錯(cuò)文件的URL
 * @param {Long}  lineNumber   出錯(cuò)代碼的行號
 * @param {Long}  columnNumber  出錯(cuò)代碼的列號
 * @param {Object} errorObj    錯(cuò)誤信息Object
 */
window.onerror = function(errorMessage, scriptURL, lineNumber,columnNumber,errorObj) { 
  // code..
}

onerror的實(shí)現(xiàn)方式各瀏覽器略有差異,但是前三個(gè)參數(shù)都是相同的,某些低版本瀏覽器沒有后兩個(gè)參數(shù)。

最后一個(gè)參數(shù)errorObj各瀏覽器實(shí)現(xiàn)的程度不一致,具體可參考這里。

下圖是被onerror捕獲到的一個(gè)異常的具體信息:

綜上所述,window.onerror方案的優(yōu)點(diǎn)是減少了開發(fā)人員的工作量,部署方便,并且可以捕獲語法錯(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ā)請求機(jī)制。那么在跨域JS文件中發(fā)生異常的時(shí)候,onerror監(jiān)聽會捕獲到什么信息呢?請看下圖:

只有一個(gè)稍微有價(jià)值的信息Script error,其他什么信息都沒有,為什么會這樣呢?

我們都知道瀏覽器有同源資源限制,常規(guī)狀態(tài)下是無法進(jìn)行跨域請求的。而script、img、iframe標(biāo)簽的src屬性是沒有這種限制的,這也是很多跨域方案的基礎(chǔ)。但是即使script標(biāo)簽可以請求到異域的js文件,此文件中的信息也并不能暴露到當(dāng)前域內(nèi),這也是瀏覽器的安全措施所致。

那么有沒有辦法獲取到異域資源的異常信息呢?

其實(shí)很簡單,目前可以說基本上所有的web產(chǎn)品對于js/css/image等靜態(tài)資源都在服務(wù)端設(shè)置了Access-Control-Allow-Origin: *的響應(yīng)頭,也就是允許跨域請求。在這個(gè)環(huán)境下,只要我們在請求跨域資源的script標(biāo)簽上添加一個(gè)crossorigin屬性即可:

<script src="http://static.toutiao.com/test.js" crossorigin></script>

這樣的話,異域的test.js文件中發(fā)生異常時(shí)便可以被當(dāng)前域的onerror監(jiān)聽捕獲到詳細(xì)的異常信息。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript的parseInt 取整使用

    JavaScript的parseInt 取整使用

    JavaScript 是弱類型語言, 為了保證數(shù)值的有效性, 在處理數(shù)值的時(shí)候, 我們可以對數(shù)值字符串進(jìn)行強(qiáng)行轉(zhuǎn)換. 如 parseInt 取整和 parseFloat 取浮點(diǎn)數(shù)
    2011-05-05
  • js實(shí)現(xiàn)簡單的打印表格

    js實(shí)現(xiàn)簡單的打印表格

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡單的打印表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • JavaScript eval()函數(shù)定義及使用方法詳解

    JavaScript eval()函數(shù)定義及使用方法詳解

    這篇文章主要介紹了JavaScript eval()函數(shù)定義及使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JS運(yùn)動改變單物體透明度的方法分析

    JS運(yùn)動改變單物體透明度的方法分析

    這篇文章主要介紹了JS運(yùn)動改變單物體透明度的方法,結(jié)合實(shí)例形式分析了頁面元素屬性動態(tài)修改相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理

    關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理

    箭頭函數(shù)可以說是es6的一大亮點(diǎn),使用箭頭函數(shù),可以簡化編碼過程,是代碼更加的簡潔,下面這篇文章主要給大家介紹了關(guān)于ES6中箭頭函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • wangEditor富文本編譯器插件學(xué)習(xí)系列之工具欄配置

    wangEditor富文本編譯器插件學(xué)習(xí)系列之工具欄配置

    這篇文章主要給大家介紹了關(guān)于wangEditor富文本編譯器插件學(xué)習(xí)系列之工具欄配置的相關(guān)資料,wangEditor是一款基于原生JavaScript封裝,開源免費(fèi)的富文本編輯器,支持常規(guī)的文字排版操作、插入圖片、插入視頻、插入代碼等功能,需要的朋友可以參考下
    2023-12-12
  • 一篇文章帶你淺入webpack的DLL優(yōu)化打包

    一篇文章帶你淺入webpack的DLL優(yōu)化打包

    這篇文章主要介紹了一篇文章帶你淺入webpack的DLL優(yōu)化打包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能

    使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能

    這篇文章主要介紹了使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能,需要的朋友可以參考下
    2014-10-10
  • JavaScript/TypeScript中==和===的區(qū)別詳解

    JavaScript/TypeScript中==和===的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript/TypeScript中==和===區(qū)別的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • js清空form表單中的內(nèi)容示例

    js清空form表單中的內(nèi)容示例

    這篇文章主要介紹了js如何清空form表單中的內(nèi)容,下面有個(gè)不錯(cuò)的示例,大家可以參考下
    2014-05-05

最新評論

郴州市| 华宁县| 金湖县| 乌兰县| 亚东县| 滦南县| 长春市| 鹤岗市| 白城市| 介休市| 古交市| 琼中| 高台县| 洛川县| 沅陵县| 崇义县| 长沙市| 睢宁县| 宁强县| 花垣县| 通榆县| 格尔木市| 炉霍县| 定陶县| 慈利县| 霸州市| 黑水县| 建瓯市| 当雄县| 大安市| 枝江市| 马公市| 张家界市| 海伦市| 老河口市| 石城县| 波密县| 体育| 云安县| 金平| 定远县|