日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一篇文章教你如何捕獲前端錯(cuò)誤

隨著前端頁(yè)面承載功能越來越多,用戶本地瀏覽器環(huán)境也錯(cuò)綜復(fù)雜,因此即使有完善的測(cè)試,我們也無法保證上線的代碼不會(huì)出錯(cuò)。在這種場(chǎng)景下,前端頁(yè)面的監(jiān)控就成了各個(gè)web項(xiàng)目必備的工具。

一般對(duì)頁(yè)面的監(jiān)控包含頁(yè)面性能、頁(yè)面錯(cuò)誤以及用戶行為路徑獲取上報(bào)等。

而本文將重點(diǎn)關(guān)注其中的錯(cuò)誤部分,主要介紹一下常見的錯(cuò)誤類型以及如何對(duì)它們進(jìn)行捕獲并上報(bào)。

常見錯(cuò)誤的分類

對(duì)于用戶在訪問頁(yè)面時(shí)發(fā)生的錯(cuò)誤,主要包括以下幾個(gè)類型:

1、js運(yùn)行時(shí)錯(cuò)誤

JavaScript代碼在用戶瀏覽器中執(zhí)行時(shí),由于一些邊界情況、本地環(huán)境的不可控等因素,可能會(huì)存在js運(yùn)行時(shí)錯(cuò)誤。

而依賴客戶端的某些方法,由于兼容性或者網(wǎng)絡(luò)等問題,也有概率會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤。

e.g: 下圖是當(dāng)使用了未定義的變量"foo",導(dǎo)致產(chǎn)生js運(yùn)行時(shí)錯(cuò)誤時(shí)的上報(bào)數(shù)據(jù):

 

2、資源加載錯(cuò)誤

這里的靜態(tài)資源包括js、css以及image等?,F(xiàn)在的web項(xiàng)目,往往依賴了大量的靜態(tài)資源,而且一般也會(huì)有cdn存在。

如果某個(gè)節(jié)點(diǎn)出現(xiàn)問題導(dǎo)致某個(gè)靜態(tài)資源無法訪問,就需要能夠捕獲這種異常并進(jìn)行上報(bào),方便***時(shí)間解決問題。

e.g: 下圖是圖片資源不存在時(shí)的上報(bào)數(shù)據(jù):

3、未處理的promise錯(cuò)誤

未使用catch捕獲的promise錯(cuò)誤,往往都會(huì)存在比較大的風(fēng)險(xiǎn)。而編碼時(shí)有可能覆蓋的不夠全面,因此有必要監(jiān)控未處理的promise錯(cuò)誤并進(jìn)行上報(bào)。

e.g: 下圖是promise請(qǐng)求接口發(fā)生錯(cuò)誤后,未進(jìn)行catch時(shí)的上報(bào)數(shù)據(jù):

4、異步請(qǐng)求錯(cuò)誤(fetch與xhr)

異步錯(cuò)誤的捕獲分為兩個(gè)部分:一個(gè)是傳統(tǒng)的XMLHttpRequest,另一個(gè)是使用fetch api。

像axios和jQuery等庫(kù)就是在xhr上的封裝,而有些情況也可能會(huì)使用原生的fetch,因此對(duì)這兩種情況都要進(jìn)行捕獲。

e.g: 下圖是xhr請(qǐng)求接口返回400時(shí)捕獲后的上報(bào)數(shù)據(jù):

 

各個(gè)類型錯(cuò)誤的捕獲方式

1、window.onerror與window.addEventListener('error')捕獲js運(yùn)行時(shí)錯(cuò)誤

使用window.onerror和window.addEventListener('error')都能捕獲,但是window.onerror含有詳細(xì)的error堆棧信息,存在error.stack中,所以我們選擇使用onerror的方式對(duì)js運(yùn)行時(shí)錯(cuò)誤進(jìn)行捕獲。

 
 
 
 
  1. window.onerror = function (msg, url, lineNo, columnNo, error) { 
  2.     // 處理錯(cuò)誤信息 
  3. // demo 
  4. msg: Uncaught TypeError: Uncaught ReferenceError: a is not defined 
  5. error.statck: TypeError: ReferenceError: a is not defined at http://xxxx.js:1:13 
  6. window.addEventListener('error', event => (){  
  7.   // 處理錯(cuò)誤信息 
  8. }, false); 
  9. // true代表在捕獲階段調(diào)用,false代表在冒泡階段捕獲。使用true或false都可以,默認(rèn)為false 

2、資源加載錯(cuò)誤使用addEventListener去監(jiān)聽error事件捕獲

實(shí)現(xiàn)原理:當(dāng)一項(xiàng)資源(如或 

此步驟的作用是告知瀏覽器以匿名方式獲取目標(biāo)腳本。這意味著請(qǐng)求腳本時(shí)不會(huì)向服務(wù)端發(fā)送潛在的用戶身份信息(例如 Cookies、HTTP 證書等)。

添加跨域 HTTP 響應(yīng)頭:

 
 
 
 
  1. Access-Control-Allow-Origin: * 

或者

 
 
 
 
  1. Access-Control-Allow-Origin: http://test.com 

注意:大部分主流 CDN 默認(rèn)添加了 Access-Control-Allow-Origin 屬性。

完成上述兩步之后,即可通過 window.onerror 捕獲跨域腳本的報(bào)錯(cuò)信息。

解決方案2

難以在 HTTP 請(qǐng)求響應(yīng)頭中添加跨域?qū)傩詴r(shí),還可以考慮 try catch 這個(gè)備選方案。

在如下示例 HTML 頁(yè)面中加入 try catch:

 
 
 
 
  1.  
  2.  
  3.  
  4.     Test page in http://test.com 
  5.  
  6.  
  7.      
  8.     // app.js里面有一個(gè)foo方法,調(diào)用了不存在的bar方法 
  9.      
  10.  
  11.  
  12.  
  13. // 運(yùn)行輸出結(jié)果如下: 
  14.  
  15. => ReferenceError: bar is not defined 
  16. at foo (http://another-domain.com/app.js:2:3) 
  17. at http://test.com/:15:3 
  18. => "Script error.", "", 0, 0, undefined 

可見 try catch 中的 Console 語(yǔ)句輸出了完整的信息,但 window.onerror 中只能捕獲“Script error”。根據(jù)這個(gè)特點(diǎn),可以在 catch 語(yǔ)句中手動(dòng)上報(bào)捕獲的異常。

總結(jié)

上述的錯(cuò)誤捕獲基本覆蓋了前端監(jiān)控所需的錯(cuò)誤場(chǎng)景,但是第三部分指出的兩個(gè)其他問題,目前解決的方式都不太***。

對(duì)于有使用框架的項(xiàng)目:一是需要有額外的處理流程,比如示例中就需要單獨(dú)為vue項(xiàng)目進(jìn)行初始化;二是對(duì)于其他框架,都需要單獨(dú)處理,例如react項(xiàng)目的話,則需要使用官方提供的componentDidCatch方法來做錯(cuò)誤捕獲。

而對(duì)于跨域js捕獲的問題:我們并不能保證所有的跨域靜態(tài)資源都添加跨域 HTTP 響應(yīng)頭;而通過第二種包裹try-catch的方式進(jìn)行上報(bào),則需要考慮的場(chǎng)景繁多并且無法保證沒有遺漏。

雖然存在這兩點(diǎn)不足,但前端錯(cuò)誤捕獲這部分還是和項(xiàng)目的使用場(chǎng)景密切相關(guān)的。我們可以在了解這些方式以后,選擇最適合自己項(xiàng)目的方案,為自己的監(jiān)控工具服務(wù)。


當(dāng)前標(biāo)題:一篇文章教你如何捕獲前端錯(cuò)誤
瀏覽路徑:http://www.dlmjj.cn/article/ccegdhh.html