JavaScript try catch finally Error Handling (例外處理)
例外處理 (error handling) 是 JavaScript 的一種程式流程控制,你可以在程式執行可能拋出錯誤的地方使用,主動捕捉並處理錯誤,避免整個程式因為發生錯誤而停止執行。
語法:
try {
// 預期可能會發生錯誤的程式碼
} catch (e) {
// try 區塊有拋出錯誤時,則執行這裡的程式碼
} finally {
// finally 區塊的程式碼一定會在最後被執行
// 你可以省略 finally 區塊
}
把可能出錯的程式碼放在 try
區塊中;然後出錯時的處理程式碼放在 catch
區塊中;而放在 finally
區塊中的程式碼無論如何都會在最後被執行。
JavaScript 會有這些類型的錯誤:
錯誤類型 | 說明 |
---|---|
EvalError | eval() 執行錯誤 |
RangeError | 一個數值超過允許範圍 |
ReferenceError | 存取未宣告的變數 |
SyntaxError | 程式語法錯誤 |
TypeError | 型別錯誤 |
URIError | URI handling 相關函數例如 decodeURIComponent() 執行時錯誤 |
try-catch-finally 用法例子:
try {
blah('Hello world');
} catch(err) {
alert(err.name + ': ' + err.message);
} finally {
alert('try catch 區塊結束');
}
因為我們沒有宣告 blah 這函數,呼叫 blah 函數時會發生錯誤,因為程式發生錯誤的位置在 try 區塊,所以錯誤會被 catch 區塊捕捉到,上面程式碼依序會跳出視窗 "ReferenceError: blah is not defined" -> "try catch 區塊結束"。
catch 區塊會接受一個參數,代表錯誤物件 (Error Object),錯誤物件有兩個屬性:
name
表示錯誤類型,例如 "ReferenceError"message
說明為什麼錯誤的文字訊息
主動拋出例外錯誤 throw
你可以用 throw
關鍵字在程式中主動拋出錯誤,拋出的例外可以是一個字串 (string)、數字 (number) 或錯誤物件 (error object)。
語法:
throw err;
例如:
try {
throw 'myException';
} catch (err) {
// err 是字串 "myException"
err;
}
try {
throw 101;
} catch (err) {
// err 是數字 101
err;
}
JavaScript 有一個 Error 物件,所有的例外錯誤都是繼承自 Error 物件。你可以客製化一個自己的錯誤物件 - new Error()
:
try {
throw new Error('oops');
} catch (err) {
// 輸出 "Error: oops"
console.log(err.name + ': ' + err.message);
}
instanceof
如果預期拋出的錯誤可能會有很多種類型,我們可以用 instanceof 來判斷該錯誤是哪一類錯誤:
try {
foo.bar();
} catch (err) {
// 如果錯誤類型是 EvalError
if (err instanceof EvalError) {
console.log(err.name + ': ' + err.message);
// 如果錯誤類型是 RangeError
} else if (err instanceof RangeError) {
console.log(err.name + ': ' + err.message);
}
// ...
}