iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0
Modern Web

JavaScript Note系列 第 21

Exception handling 例外處理

在設計程式的過程中,難免會發生問題,導致程式卡住無法做進一步的處理,站在工程師的角度,可以從瀏覽器報出的錯誤訊息,判斷問題從何而來。

但以使用者的觀點來看,這樣的訊息根本看不懂,他們只知道,網站掛了。

很多會發生的問題,我們可以預防與事先排除,但最難預測的是使用者輸入資料,這是我們無法預期的,所以例外處理的機制,可以讓我們在程式發生問題的時候,依照錯誤的類型做進一步的處理。

例外處理是指,當產生了一個預期外的值或結果時,我們得做處理,這個值不一定是錯的,卻不是我們預期的值,即使如此,在JS中例外跟錯誤代表相同的意義。

為了因應例外情況,得用以下的指令處理。

try {
    可能會發生例外的執行區塊
} catch (error) {
    例外發生時的執行區塊
} finally {
    不論是否有發生例外,都會執行
}

例外狀況

let x = 1;
let s = x + y;
console.log(s);
console.log('產生例外無法執行');

https://ithelp.ithome.com.tw/upload/images/20181105/20112573mXnW3pftSe.png
因為沒有定義變數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屬性顯示錯誤類型。
https://ithelp.ithome.com.tw/upload/images/20181105/2011257372i7WOFCpH.png
不再是紅字,而是以訊息表達錯誤,不過訊息仍然不夠明確,畢竟這是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物件。當執行期間發生錯誤時,Error物件實體會被拋出(throw)。
由catch接收物件,解析錯誤資訊。

Error 物件會依據不同的錯誤情況而有不同的類型:

類型 資訊
EvalError 使用eval( )函式產生的錯誤,不過eval( )函式幾乎很少使用
InternalError JavaScript引擎的內部錯誤。例如:過多的遞迴
RangeError 超出有效範圍值的錯誤
ReferenceError 參考錯誤。例如:找不到變數
SyntaxError 語法錯誤
TypeError 型別錯誤
URIError 無效URI的錯誤

參考來源:
MDN Control flow and error handling

MDN Error


上一篇
var & let & const
下一篇
Object 物件
系列文
JavaScript Note31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言