摘要:錯(cuò)誤主要有類語(yǔ)法錯(cuò)誤腳本錯(cuò)誤監(jiān)控方式有種異常處理處理異常的能力有限,只能捕獲到運(yùn)行時(shí)的非異步錯(cuò)誤,對(duì)于語(yǔ)法錯(cuò)誤和異步錯(cuò)誤就顯得無(wú)能為力。
js錯(cuò)誤主要有2類:語(yǔ)法錯(cuò)誤、腳本錯(cuò)誤;
監(jiān)控方式有2種:try-catch、window.onerror
try-catch處理異常的能力有限,只能捕獲到運(yùn)行時(shí)的非異步錯(cuò)誤,對(duì)于語(yǔ)法錯(cuò)誤和異步錯(cuò)誤就顯得無(wú)能為力。
try{ error // <- 未定義變量 } catch(e) { console.log("捕獲到錯(cuò)誤"); console.log(e); } //輸出: //ReferenceError: error is not defined
try { var error = "error"; // <-大寫分號(hào) } catch(e) { console.log("捕獲不到錯(cuò)誤"); console.log(e); } //輸出: //Uncaught SyntaxError: Invalid or unexpected token
try{ setTimeout(function () { error // <- 異步錯(cuò)誤 }, 0) } catch(e) { console.log("捕獲不到錯(cuò)誤"); console.log(e); } //輸出: //Uncaught ReferenceError: error is not definedwindow.onerror 異常處理
window.onerror 捕獲異常的能力比 try-catch稍強(qiáng)一點(diǎn),無(wú)論是異步還是非異步的錯(cuò)誤,onerror都能捕獲到運(yùn)行時(shí)的錯(cuò)誤
/** * @param {String} msg 錯(cuò)誤信息 * @param {String} url 出錯(cuò)文件 * @param {Number} row 行號(hào) * @param {Number} col 列號(hào) * @param {Object} error 錯(cuò)誤詳細(xì)信息 */ window.onerror = function (msg, url, row, col, error) { console.log("捕獲到運(yùn)行時(shí)同步錯(cuò)誤了"); console.log({ msg, url, row, col, error }) return true; }; error; // <- 未定義變量 //輸出: //捕獲到錯(cuò)誤了 //{msg: "Uncaught ReferenceError: error is not defined", ...}
window.onerror = function (msg, url, row, col, error) { console.log("捕獲到異步錯(cuò)誤了"); console.log({ msg, url, row, col, error }) return true; }; setTimeout(() => { error; // <- 未定義變量 }); //輸出: //捕獲到異步錯(cuò)誤了 //{msg: "Uncaught ReferenceError: error is not defined", ...}
在實(shí)際使用中,onerror主要用來(lái)捕獲預(yù)料之外的錯(cuò)誤,try-catch則是用來(lái)在可預(yù)見(jiàn)情況下監(jiān)控特定的錯(cuò)誤,兩者結(jié)合使用更加高效
但是對(duì)于語(yǔ)法錯(cuò)誤,window.onerror還是捕獲不了,所以我們?cè)趯懘a的時(shí)候要盡可能避免語(yǔ)法錯(cuò)誤,不過(guò)一般這種錯(cuò)誤比較容易察覺(jué)。
除了語(yǔ)法錯(cuò)誤不能捕獲之外,網(wǎng)絡(luò)異常的錯(cuò)誤也是不能捕獲的
輸出: GET http://localhost:8081/404.jpg 404 (Not Found)
這是因?yàn)榫W(wǎng)絡(luò)請(qǐng)求是沒(méi)有事件冒泡的,所以需要在捕獲階段才能捕獲到異常,雖然這樣可以捕獲到網(wǎng)絡(luò)的異常,但無(wú)法判斷http的狀態(tài),比如該異常是404還是500,想要知道這個(gè)狀態(tài)就必須和服務(wù)日志一起排查了。
輸出: GET http://localhost:8081/404.jpg 404 (Not Found) 我知道錯(cuò)誤了 {msg: Event, url: undefined, row: undefined, col: undefined, error: undefined}
Promise的錯(cuò)誤沒(méi)有使用catch去捕獲的話,上述的方式都是不能捕獲到錯(cuò)誤的。但通過(guò)監(jiān)聽(tīng)unhandledrejection事件,可以捕獲未處理的Promise錯(cuò)誤。但是需要注意的是,這個(gè)事件是有兼容問(wèn)題的。
window.addEventListener("unhandledrejection", function(e){ e.preventDefault() console.log("我知道 promise 的錯(cuò)誤了"); console.log(e.reason); return true; }); new Promise((resolve, reject) => { reject("promise error"); }); 輸出: 我知道 promise 的錯(cuò)誤了 promise error
說(shuō)完這些捕獲異常的方式之后,該說(shuō)說(shuō)異常上報(bào)的常用方法了。
異常上報(bào)當(dāng)我們拿到報(bào)錯(cuò)信息之后,就需要上報(bào)這些異常信息,我們上報(bào)的方式通常有兩種方法:
通過(guò)Ajax發(fā)送數(shù)據(jù)
通過(guò)動(dòng)態(tài)創(chuàng)建img標(biāo)簽的形式
function report(error) { var reportUrl = "http://xxxx/report"; new Image().src = reportUrl + "error=" + error; }script error 腳本錯(cuò)誤
在一個(gè)域下引用了其他域的腳本,又沒(méi)有去做額外的配資,就很容易產(chǎn)生Script error。說(shuō)到最后這就是因?yàn)闉g覽器的同源策略產(chǎn)生的。所以最好我們還是使用跨源資源共享機(jī)制( CORS )
// http://localhost:8080/index.html // http://localhost:8081/test.js setTimeout(() => { console.log(error); });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101584.html
摘要:緩存長(zhǎng)緩存隨機(jī)名字長(zhǎng)緩存策略可并行請(qǐng)求數(shù)避免重定向,一次重定向至少瀏覽器緩存不超過(guò)數(shù)據(jù)不安全存取防止出錯(cuò)關(guān)閉瀏覽器失效合理減少視覺(jué)交互反饋節(jié)流,防抖視覺(jué)欺詐分頁(yè)預(yù)加載資源圖片,慎用編碼響應(yīng)式圖像字體異步加載異步加載其他系列二 http 緩存 http1.0: expires,last-modifiedhttp1.1 E-tag,cache-controlhtml no-cache c...
摘要:緩存長(zhǎng)緩存隨機(jī)名字長(zhǎng)緩存策略可并行請(qǐng)求數(shù)避免重定向,一次重定向至少瀏覽器緩存不超過(guò)數(shù)據(jù)不安全存取防止出錯(cuò)關(guān)閉瀏覽器失效合理減少視覺(jué)交互反饋節(jié)流,防抖視覺(jué)欺詐分頁(yè)預(yù)加載資源圖片,慎用編碼響應(yīng)式圖像字體異步加載異步加載其他系列二 http 緩存 http1.0: expires,last-modifiedhttp1.1 E-tag,cache-controlhtml no-cache c...
摘要:緩存長(zhǎng)緩存隨機(jī)名字長(zhǎng)緩存策略可并行請(qǐng)求數(shù)避免重定向,一次重定向至少瀏覽器緩存不超過(guò)數(shù)據(jù)不安全存取防止出錯(cuò)關(guān)閉瀏覽器失效合理減少視覺(jué)交互反饋節(jié)流,防抖視覺(jué)欺詐分頁(yè)預(yù)加載資源圖片,慎用編碼響應(yīng)式圖像字體異步加載異步加載其他系列二 http 緩存 http1.0: expires,last-modifiedhttp1.1 E-tag,cache-controlhtml no-cache c...
摘要:告警當(dāng)一個(gè)問(wèn)題通過(guò)告警系統(tǒng)將消息以短信電話郵件等方式告知給用戶時(shí),我們稱之為一條告警。圖統(tǒng)一告警系統(tǒng)結(jié)構(gòu)圖告警收斂對(duì)于告警平臺(tái)每天會(huì)產(chǎn)生數(shù)以萬(wàn)計(jì)的告警,這些告警對(duì)于運(yùn)維或開(kāi)發(fā)人員都需要去分析甄別優(yōu)先級(jí)并處理故障。 一、背景一套監(jiān)控系統(tǒng)檢測(cè)和告警是密不可分的,檢測(cè)用來(lái)發(fā)現(xiàn)異常,告警用來(lái)將問(wèn)題信息發(fā)送給相應(yīng)的人。v...
閱讀 655·2021-11-18 10:02
閱讀 1123·2021-11-02 14:41
閱讀 744·2021-09-03 10:29
閱讀 1985·2021-08-23 09:42
閱讀 2810·2021-08-12 13:31
閱讀 1263·2019-08-30 15:54
閱讀 2015·2019-08-30 13:09
閱讀 1495·2019-08-30 10:55