你需要了解的幾種 JavaScript 異常類型
無論是瀏覽器控制臺(tái)還是 Node.js 的服務(wù)端,我們會(huì)在各種地方看到 JavaScript 異常,異常處理是編寫程序必備的基礎(chǔ)能力,在學(xué)習(xí)異常處理之前,了解 JavaScript 中的幾種異常類型是非常有必要的。
Error
Error 是最基本的錯(cuò)誤類型,其他的錯(cuò)誤類型都繼承自該類型。Error 對(duì)象主要有兩個(gè)重要屬性 message 和 name 分別表示錯(cuò)誤信息和錯(cuò)誤名稱。
程序運(yùn)行過程中拋出的異常一般都有具體的類型,Error 類型一般都是開發(fā)人員自己拋出的異常。
- try {
 - throw new Error('ConardLi拋出的異常');
 - } catch (error) {
 - console.log(error);
 - }
 
SyntaxError - 語法錯(cuò)誤
語法錯(cuò)誤也稱為解析錯(cuò)誤。語法錯(cuò)誤在任何編程語言中都是最常見的錯(cuò)誤類型,表示不符合編程語言的語法規(guī)范。
JavaScript 是一門解釋性語言,執(zhí)行一段代碼時(shí)需要經(jīng)歷 詞法分析 -> 語法分析 -> 語法樹 就可以開始解釋執(zhí)行了:
詞法分析是將字符流(char stream)轉(zhuǎn)換為記號(hào)流(token stream)、語法分析階段會(huì)將記號(hào)流(token stream)生成抽象語法樹(AST)。
在這兩個(gè)階段,如果 Javascript引擎發(fā)現(xiàn)了預(yù)期之外/無法抓換的 token,或者 token 順序和預(yù)期不一致時(shí),就會(huì)拋出 SyntaxError。
因此 SyntaxError 應(yīng)該和其他類型的異常區(qū)分開,此類異常發(fā)生在 JavaScript解析/編譯時(shí),此類異常一旦發(fā)生,導(dǎo)致整個(gè)js文件都無法執(zhí)行,而其他異常發(fā)生在代碼運(yùn)行時(shí),這一類的錯(cuò)誤會(huì)導(dǎo)致在錯(cuò)誤出現(xiàn)的那一行之后的代碼無法執(zhí)行,但在那一行之前的代碼不會(huì)受到影響。
TypeError - 類型錯(cuò)誤
運(yùn)行時(shí)最常見的異常,表示變量或參數(shù)不是預(yù)期類型,比如 new 關(guān)鍵字后面必須為構(gòu)造函數(shù)、()前必須為函數(shù)。
ReferenceError - 引用錯(cuò)誤
引用一個(gè)不存在的變量時(shí)發(fā)生的錯(cuò)誤,每當(dāng)我們創(chuàng)建或定義一個(gè)變量時(shí),變量名稱都會(huì)寫入一個(gè)變量存儲(chǔ)中心中。這個(gè)變量存儲(chǔ)中心就像鍵值存儲(chǔ)一樣,每當(dāng)我們引用變量時(shí),它都去存儲(chǔ)中找到 Key 并提取并返回 Value,如果我們要找的變量不在存儲(chǔ)中,就會(huì)拋出 ReferenceError。
請(qǐng)注意,如果我們調(diào)用的是一個(gè)已經(jīng)存在的變量的一個(gè)不存在的屬性,則不會(huì)拋出 ReferenceError,因?yàn)樽兞勘旧硪呀?jīng)在存儲(chǔ)中了,調(diào)用它不存在的屬性只會(huì)是未定義狀態(tài),也就是 undefined:
RangeError - 邊界錯(cuò)誤
表示超出有效范圍時(shí)發(fā)生的異常,主要的有以下幾種情況:
- 數(shù)組長度為負(fù)數(shù)或超長
 - 數(shù)字類型的方法參數(shù)超出預(yù)定義范圍
 - 函數(shù)堆棧調(diào)用超過最大值
 
URIError - URL 錯(cuò)誤在調(diào)用 URI 相關(guān)的方法中 URL 無效時(shí)拋出的異常,主要包括 encodeURI、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()幾個(gè)函數(shù):
自定義異常
另外,為了滿足各種各樣的業(yè)務(wù)需求,除了 JavaScript 已經(jīng)給定的異常類型,我們還可以自定義一些異常類型,比如我們要根據(jù)不同的異常類型給用戶不同的錯(cuò)誤提示:
- class UnAuthError extends Error { }
 - class ParamError extends Error { }
 - function controller() {
 - throw new UnAuthError();
 - }
 - try {
 - controller();
 - } catch (error) {
 - if (error instanceof UnAuthError) {
 - return '無權(quán)限';
 - }
 - if (error instanceof ParamError) {
 - return '參數(shù)錯(cuò)誤';
 - }
 - }
 























 
 
 









 
 
 
 