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