你知道JavaScript這六種錯誤型別嗎?
阿新 • • 發佈:2019-09-02
前言
今日話題,瞭解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:9\n" }
如果未宣告變數就使用,就會丟擲這個異常哦!
二、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:3\n"
}
建立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:9\n"
}
相容性