在設計程式的過程中,難免會發生問題,導致程式卡住無法做進一步的處理,站在工程師的角度,可以從瀏覽器報出的錯誤訊息,判斷問題從何而來。
但以使用者的觀點來看,這樣的訊息根本看不懂,他們只知道,網站掛了。
很多會發生的問題,我們可以預防與事先排除,但最難預測的是使用者輸入資料,這是我們無法預期的,所以例外處理的機制,可以讓我們在程式發生問題的時候,依照錯誤的類型做進一步的處理。
例外處理是指,當產生了一個預期外的值或結果時,我們得做處理,這個值不一定是錯的,卻不是我們預期的值,即使如此,在JS中例外跟錯誤代表相同的意義。
為了因應例外情況,得用以下的指令處理。
try {
可能會發生例外的執行區塊
} catch (error) {
例外發生時的執行區塊
} finally {
不論是否有發生例外,都會執行
}
例外狀況
let x = 1;
let s = x + y;
console.log(s);
console.log('產生例外無法執行');
因為沒有定義變數y,所以執行到一半會出現尚未定義的錯誤訊息,導致接下來的程式無法執行,顯示的訊息使用者也看不懂,這時我們就可以使用try...catch...來捕抓例外。
try {
let x = 1;
let s = x + y;
} catch (e) {
console.log(e.name);
console.log(e.message);
} finally {
console.log('處理完畢');
}
在catch中,有個Error物件,這邊用參數e表示,在try裡面發生的錯誤資訊會傳到該物件,並利用Error物件的message屬性顯示錯誤訊息,name屬性顯示錯誤類型。
不再是紅字,而是以訊息表達錯誤,不過訊息仍然不夠明確,畢竟這是JS自己處理的機制,如果我們需要自行設定錯誤訊息的話,可用下列範例。
try {
let x = 1;
if (typeof y || typeof x)
throw new Error('為定義x或y');
let s = x + y;
} catch (e) {
console.log(e.name);
console.log(e.message);
} finally {
console.log('處理完畢');
}
設定判斷式,如果x或y非有效值,就丟出(throw)一個新的Erroe物件,在建立物件的同時,可自訂錯誤訊息。
catch接收到,參數e代表Erroe物件,利用屬性顯示錯誤資訊。
Error建構函式能用來建立一個error物件。當執行期間發生錯誤時,Error物件實體會被拋出(throw)。
由catch接收物件,解析錯誤資訊。
Error 物件會依據不同的錯誤情況而有不同的類型:
類型 | 資訊 |
---|---|
EvalError | 使用eval( )函式產生的錯誤,不過eval( )函式幾乎很少使用 |
InternalError | JavaScript引擎的內部錯誤。例如:過多的遞迴 |
RangeError | 超出有效範圍值的錯誤 |
ReferenceError | 參考錯誤。例如:找不到變數 |
SyntaxError | 語法錯誤 |
TypeError | 型別錯誤 |
URIError | 無效URI的錯誤 |
參考來源:
MDN Control flow and error handling
MDN Error