介: 為了提升應用穩定性,我們對前端項目開展了腳本異常治理的工作,對生產上報的js error進行了整體排查,試圖通過降低腳本異常的發生頻次來提升相關告警的準確率,結合最近在這方面閱讀的相關資料,嘗試階段性的做個總結,下面我們來介紹下js異常處理的一些經驗。
作者 | 肖榮強(路遷)
來源 | 阿里開發者公眾號
為了提升應用穩定性,我們對前端項目開展了腳本異常治理的工作,對生產上報的js error進行了整體排查,試圖通過降低腳本異常的發生頻次來提升相關告警的準確率,結合最近在這方面閱讀的相關資料,嘗試階段性的做個總結,下面我們來介紹下js異常處理的一些經驗。
先來看一下官方的定義:
Error objects are thrown when runtime errors occur. The Error object can also be used as a base object for user-defined exceptions.
描述的很簡單,我們總結一下就是代碼在執行過程中遇到了問題,程序已經無法正常運行了,Error對象會被拋出,這一點它不同于大部分編程語言里使用的異常對象Exception,甚至更適合稱之為錯誤,應該說事實也確實如此,Error對象在未被拋出時候和js里其他的普通對象沒有任何差別是不會引發異常的,同時Error 對象也可用于用戶自定義錯誤的基礎對象。
看下面兩個例子:
↓↓↓執行結果↓↓↓
結論:只有在執行過程中的異常可以被捕獲,語法解析階段的異常或者不在當前同步任務中的異常都無法被捕獲。
↓↓↓執行結果↓↓↓
以上紅色信息里包含了異常信息(message)和棧跟蹤(stack trace)信息,對于定位代碼中的問題起到重要作用,可以看到棧跟蹤是從底部文件位置21:15到頂部25:7位置的;前兩個console在遇到異常時候未被執行,第二個script標簽內的代碼被正常執行。
結論:當任務執行過程中出現未處理的異常,會一直沿著調用棧一層層向外拋出(有點像事件冒泡),最終會導致當前任務被終止執行。當前任務終止后JS 線程會繼續從任務隊列中提取下一個任務繼續執行。
異常的類型
錯誤名 | 描述 | 示例 |
EvalError | 關于 eval [1]函數的錯誤,已不在當前ECMAScript規范中使用,不再會被運行時拋出。 | throw new EvalError('EvalError', 'file.js', 10); // 可以由業務代碼主動拋出 |
RangeError | 值不在允許的范圍內,典型的是試圖傳遞一個數值給一個范圍內不包含該數值的函數,此時應該引發RangeError。 | const numObj=123;numObj.toFixed(-1); // Uncaught RangeError: toFixed() digits argument must be between 0 and 100 at Number.toFixed |
ReferenceError | 當一個不存在(或尚未初始化)的變量被引用時發生的錯誤。 | const a=undefinedVariable; // Uncaught ReferenceError: undefinedVariable is not defined |
SyntaxError | 解析代碼階段,發現了不符合語法規范的代碼。 | const 111variable=1; // Uncaught SyntaxError: Invalid or unexpected token |
TypeError | 類型錯誤,用來表示值的類型是非預期類型。 | const a=null;a.doSomeThing(); // Uncaught TypeError: Cannot read properties of null (reading 'doSomeThing') |
URIError | 使用URI處理函數產生的錯誤 | decodeURIComponent('%') // U |
點擊鏈接查看原文,獲取更多福利!
https://developer.aliyun.com/article/1058117?groupCode=alitech?utm_content=g_1000361548
版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。
異常的概念:程序在運行過程中出現的錯誤 (最大的特征:一旦代碼出現異常 其后的代碼就不再執行)
在js中出現異常后,瀏覽器會給出一段錯誤碼,就是錯誤信息,錯誤消息由錯誤類型與錯誤詳細點構成
錯誤類型:
1.Error:error構造函數創建一個錯誤對象,如果程序運行環境出現錯誤,就會拋出一個該錯誤類型的實例對象,除此之外該類型還支持用戶自定義錯誤類型
2.TypeError:如果代碼訪問的數據類型錯誤 拋出異常
3.ReferenceError:當訪問的變量不存在的時候 拋出異常
4.SyntaxError:當語法錯誤的時候 拋出異常
5.URIError:當前調用URI相關函數時出現錯誤 拋出異常
6.EvalError:當非法調用eval函數的時候 拋出異常
7.RangeError:當數組等類型的方位非法使用的時候 拋出異常
##如何處理異常
就是要出現異常后 還能繼續執行
常見的異常有兩大類:
a.運行環境的多樣性
b.代碼錯誤 語法錯誤
try-catch語法: 即嘗試這么做,如果出現錯誤捕獲錯誤
try{
可能出現錯誤的代碼
}
常概念
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>處理異常</title>
</head>
<body>
</body>
<script>
try{
console.log(abc);
}catch (e) {
console.log('對不起你的代碼有錯');
console.log(e);
}
var a="正常執行"
console.log(a);
console.log(a);
console.log(a);
console.log(a);
console.log(a);
console.log(a);
</script>
</html>
輸出結果
拋出異常代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>拋出異常</title>
</head>
<body>
</body>
<script>
console.log(1);
console.log(2);
try{
o1=new Error('我是一個自定義的拋出異常');
throw o1;
} catch(e) {
console.log( e===o1);
}
console.log(3);
console.log(4);
console.log(5);
console.log(6);
</script>
</html>
輸出結果
常見錯誤:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。