你知道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" }
兼容性