JavaScript try catch finally Error Handling (例外處理)

例外處理 (error handling) 是 JavaScript 的一種程式流程控制,你可以在程式執行可能拋出錯誤的地方使用,主動捕捉並處理錯誤,避免整個程式因為發生錯誤而停止執行。

語法:

try {

   // 預期可能會發生錯誤的程式碼

} catch (e) {

   // try 區塊有拋出錯誤時,則執行這裡的程式碼

} finally {

   // finally 區塊的程式碼一定會在最後被執行
   // 你可以省略 finally 區塊

}

把可能出錯的程式碼放在 try 區塊中;然後出錯時的處理程式碼放在 catch 區塊中;而放在 finally 區塊中的程式碼無論如何都會在最後被執行。

JavaScript 會有這些類型的錯誤:

錯誤類型說明
EvalErroreval() 執行錯誤
RangeError一個數值超過允許範圍
ReferenceError存取未宣告的變數
SyntaxError程式語法錯誤
TypeError型別錯誤
URIErrorURI 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);
    }
    // ...
}