你知道JavaScript這六種錯誤類型嗎?

  • 2019 年 10 月 3 日
  • 筆記

前言

今日話題,了解JavaScript的錯誤處理機制。

一、ReferenceError

引用一個不存在的變數時發生的錯誤。將一個值分配給無法分配的對象,比如對函數的運行結果或者函數賦值。

舉栗子

  try {            console.log(a) // a 未聲明的變數          } catch (e) {              if (e instanceof ReferenceError) {                  console.log(e.name + ": " + e.message); // ReferenceError: a is not defined              }          }  

構建一個ReferenceError

        try {            throw new ReferenceError('Hello', 'someFile.js', 10);          } catch (e) {           console.log(e instanceof ReferenceError); // true           console.log(e.message);                   // "Hello"           console.log(e.name);                      // "ReferenceError"           console.log(e.fileName);                  // "someFile.js"           console.log(e.lineNumber);                // 10           console.log(e.columnNumber);              // 0           console.log(e.stack);                     // "@Scratchpad/2:2:9n"          }  
    如果未聲明變數就使用,就會拋出這個異常哦!  

二、TypeError

變數或參數不是預期類型時發生的錯誤。比如使用new字元串、布爾值等原始類型和調用對象不存在的方法就會拋出這種錯誤,因為new命令的參數應該是一個構造函數。

舉栗子

  try {            var a = {}            a.go()          } catch (e) {              if (e instanceof TypeError) {                  console.log(e.name + ": " + e.message); // TypeError: a.go is not a function              }          }  

三、EvalError

在ES5以下的JavaScript中,當eval()函數沒有被正確執行時,會拋出evalError錯誤。

舉栗子

 var myEval = eval;   myEval("alert('call eval')");    
    ES5以上的JavaScript中已經不再拋出該錯誤,但依然可以通過new關鍵字來自定義該類型的錯誤提示。  

四、RangeError

數值變數或參數超出其有效範圍

舉栗子

  try {           [].length = -1          } catch (e) {              if (e instanceof RangeError) {                  console.log(e.name + ": " + e.message); // RangeError: Invalid array length              }          }  

五、SyntaxError

語法錯誤,比如變數名不規範

舉栗子

  try {            var 1          } catch (e) {              if (e instanceof SyntaxError) {                  console.log(e.name + ": " + e.message); // SyntaxError: Unexpected number              }          }  

六、URIError

給 encodeURI()或 decodeURl()傳遞的參數無效

舉栗子

捕獲一個URIError

 try {    decodeURIComponent('%');  } catch (e) {    console.log(e instanceof URIError); // true    console.log(e.message);             // "malformed URI sequence"    console.log(e.name);                // "URIError"    console.log(e.fileName);            // "Scratchpad/1"    console.log(e.lineNumber);          // 2    console.log(e.columnNumber);        // 2    console.log(e.stack);               // "@Scratchpad/2:2:3n"  }  

創建URIError實例

try {    throw new URIError('Hello', 'someFile.js', 10);  } catch (e) {    console.log(e instanceof URIError); // true    console.log(e.message);             // "Hello"    console.log(e.name);                // "URIError"    console.log(e.fileName);            // "someFile.js"    console.log(e.lineNumber);          // 10    console.log(e.columnNumber);        // 0    console.log(e.stack);               // "@Scratchpad/2:2:9n"  }  

兼容性