今日話題,瞭解JavaScript的錯誤處理機制。bash
引用一個不存在的變量時發生的錯誤。將一個值分配給沒法分配的對象,好比對函數的運行結果或者函數賦值。函數
舉栗子ui
try {
console.log(a) // a 未聲明的變量
} catch (e) {
if (e instanceof ReferenceError) {
console.log(e.name + ": " + e.message); // ReferenceError: a is not defined
}
}
複製代碼
構建一個ReferenceErrorspa
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"
}
複製代碼
若是未聲明變量就使用,就會拋出這個異常哦!
複製代碼
變量或參數不是預期類型時發生的錯誤。好比使用new字符串、布爾值等原始類型和調用對象不存在的方法就會拋出這種錯誤,由於new命令的參數應該是一個構造函數。3d
舉栗子code
try {
var a = {}
a.go()
} catch (e) {
if (e instanceof TypeError) {
console.log(e.name + ": " + e.message); // TypeError: a.go is not a function
}
}
複製代碼
在ES5如下的JavaScript中,當eval()函數沒有被正確執行時,會拋出evalError錯誤。orm
舉栗子cdn
var myEval = eval;
myEval("alert('call eval')");
複製代碼
ES5以上的JavaScript中已經再也不拋出該錯誤,但依然能夠經過new關鍵字來自定義該類型的錯誤提示。
複製代碼
數值變量或參數超出其有效範圍對象
舉栗子blog
try {
[].length = -1
} catch (e) {
if (e instanceof RangeError) {
console.log(e.name + ": " + e.message); // RangeError: Invalid array length
}
}
複製代碼
語法錯誤,好比變量名不規範
舉栗子
try {
var 1
} catch (e) {
if (e instanceof SyntaxError) {
console.log(e.name + ": " + e.message); // SyntaxError: Unexpected number
}
}
複製代碼
給 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"
}
複製代碼