溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JS中的try catch語(yǔ)句有什么作用

發(fā)布時(shí)間:2021-09-24 09:41:30 來源:億速云 閱讀:170 作者:柒染 欄目:web開發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)JS中的try catch語(yǔ)句有什么作用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

程序是從上到下順序執(zhí)行的,同時(shí)可以通過一些控制語(yǔ)句來改變執(zhí)行的路線,受控制語(yǔ)句影響下,程序最終的執(zhí)行路線就是控制流。

js 里面的控制語(yǔ)句有 if、for、while、try catch 等,它們都會(huì)改變程序的走向。

程序是操作數(shù)據(jù)的,隨著程序的運(yùn)行,也就是控制流的前進(jìn)而改變的數(shù)據(jù)叫做數(shù)據(jù)流。

很明顯,數(shù)據(jù)流是依賴控制流的,程序分析里面的數(shù)據(jù)流分析也是要先做控制流分析。

比如這樣一段代碼:

const a = 1;
let b;

if (a === 1) {
    b = '1111';
} else {
    b = '2222';
}

因?yàn)?a 為 1,所以會(huì)執(zhí)行到 b = '1111';,這就是控制流,也就是程序最終執(zhí)行的代碼,可以用來分析程序的走向,做一些死代碼刪除之類的優(yōu)化。

而隨著控制流的執(zhí)行,b 會(huì)被賦值為 2222,這就是數(shù)據(jù)流,也就是值的變化的過程,可以用來分析某個(gè)語(yǔ)句的變量的值。

程序是針對(duì)不同數(shù)據(jù)做不同的處理,如果數(shù)據(jù)有錯(cuò)誤,那么處理程序也就沒法處理了,就會(huì)報(bào)錯(cuò),會(huì)中斷后續(xù)的控制流。比如數(shù)據(jù)為空、數(shù)據(jù)格式不對(duì)等等。這時(shí)候就要通過 try catch 做錯(cuò)誤處理,也叫異常處理。

我們做異常處理有兩個(gè)目的:

  • 對(duì)出錯(cuò)的邏輯做一些兜底處理。

比如參數(shù)解析有錯(cuò)誤的時(shí)候,在 catch 里賦一個(gè)默認(rèn)值。這種錯(cuò)誤處理之后就沒必要再報(bào)出來了。這種情況下 try catch 也是作為邏輯的一部分,相當(dāng)于 if else。

  • 對(duì)報(bào)的錯(cuò)做更場(chǎng)景化的描述。

JS 的報(bào)錯(cuò)是 JS 引擎拋出的,比如調(diào)用了一個(gè) null 對(duì)象的方法會(huì)報(bào) TypeError,使用了未聲明的變量會(huì)報(bào) ReferenceError。而具體的 Error 是在不同場(chǎng)景下報(bào)出的,就有不同的含義:

如果這個(gè)對(duì)象是來自用戶輸入的,那就是用戶輸入的有錯(cuò)誤,如果這個(gè)對(duì)象是從服務(wù)端獲取的,那就意味著服務(wù)端返回的數(shù)據(jù)有錯(cuò)誤。在不同的場(chǎng)景下,同一個(gè) Error 會(huì)有更具體的含義,所以我們要做 try catch。然后拋出一個(gè)自定義的錯(cuò)誤,包含有場(chǎng)景信息的錯(cuò)誤描述。

這點(diǎn)很多庫(kù)和框架做的都比較好,報(bào)出的錯(cuò)都是有具體的場(chǎng)景信息,甚至還有解決方式,而且還有的通過錯(cuò)誤編號(hào)做了管理,可以通過 errorno 來查詢解決方式。這種就是對(duì)錯(cuò)誤做了自定義的處理。

而很多業(yè)務(wù)代碼中報(bào)的錯(cuò)就并沒有做這種處理,是直接把原生 Error 給報(bào)出來了。我們會(huì)通過異常監(jiān)控平臺(tái)來收集一些 throw 到全局的錯(cuò)誤,而這些錯(cuò)誤往往都是比較原始的信息,雖然帶上了錯(cuò)誤位置和堆棧,但還要通過看源碼來定位問題。

比如報(bào)了一個(gè)對(duì)象為空的錯(cuò)誤,但是我怎么知道這是什么對(duì)象為空,會(huì)是什么原因,怎么解決,有沒有編號(hào)。

如果我們能夠?qū)Ω鞣N錯(cuò)誤 catch 之后 throw 出一些具體場(chǎng)景的自定義錯(cuò)誤,那是不是就好的多了。這點(diǎn)第三方庫(kù)都做得很好,而業(yè)務(wù)代碼很少有人注重場(chǎng)景化的自定義錯(cuò)誤。

當(dāng)然,前端業(yè)務(wù)代碼的用戶是通過界面來使用該軟件的,其實(shí)只要對(duì)各種錯(cuò)誤做一些 UI 上的提示就可以。而庫(kù)的代碼是給開發(fā)者用的,那么就要對(duì)各種錯(cuò)誤做場(chǎng)景化的描述,甚至給錯(cuò)誤編號(hào)并給出解決方案。

但我覺得業(yè)務(wù)代碼也應(yīng)該像第三方庫(kù)代碼那樣來對(duì)待錯(cuò)誤,不要把沒有啥意義的原生錯(cuò)誤報(bào)出來,而是報(bào)一些有具體含義的自定義錯(cuò)誤,這樣排查和解決問題就會(huì)簡(jiǎn)單很多。

不過雖然場(chǎng)景化的自定義錯(cuò)誤可以更好的幫助排查問題,那也一定是建立在對(duì)該段代碼可能報(bào)的錯(cuò)誤有把握的情況下。要是自己報(bào)出的錯(cuò)誤信息和實(shí)際的錯(cuò)誤原因不一樣,反而會(huì)增加排查問題的難度,還不如把原生錯(cuò)誤報(bào)出來。

程序執(zhí)行的流程是控制流,受控制語(yǔ)句影響,執(zhí)行的過程中會(huì)改變數(shù)據(jù),數(shù)據(jù)的變化叫做數(shù)據(jù)流,控制流和數(shù)據(jù)流是程序分析里面經(jīng)常分析的兩個(gè)方面。

錯(cuò)誤會(huì)中斷控制流,我們要對(duì)錯(cuò)誤做一些處理,通過 try catch。

錯(cuò)誤處理有兩個(gè)目的:

一個(gè)是做一些兜底的處理,相當(dāng)于 if else,不需要再把錯(cuò)誤報(bào)出來。

一個(gè)是做對(duì)原生的 JS 錯(cuò)誤做場(chǎng)景化的描述,創(chuàng)建一個(gè)有更具體信息的錯(cuò)誤對(duì)象拋出來。

這點(diǎn)很多庫(kù)做的很好,甚至還會(huì)給錯(cuò)誤編號(hào)并給出解決方式。但業(yè)務(wù)代碼其實(shí)很多只做了給用戶的 UI 上的反饋,沒有對(duì)拋出的錯(cuò)誤做場(chǎng)景化的包裝。這就導(dǎo)致了錯(cuò)誤監(jiān)控平臺(tái)收集到的錯(cuò)誤都是比較原始的錯(cuò)誤,需要查看源碼來排查。如果也能像庫(kù)的代碼那樣做一些場(chǎng)景化的錯(cuò)誤包裝,統(tǒng)計(jì)和排查起問題來會(huì)容易很多,這點(diǎn)大多數(shù) Javascript 工程師都沒做到。

上述就是小編為大家分享的JS中的try catch語(yǔ)句有什么作用了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI