2010-05-13 67 views
27

w3schools說例外可以是字符串,整數,布爾值或對象,但給出的例子並不是我的良好做法,因爲異常類型檢查是通過字符串比較完成的。這是JavaScript中異常處理的首選方法嗎?是否有內置的異常類型(如NullPointerException)? (如果是這樣,他們是什麼,他們使用什麼樣的繼承,而且他們比其他選項更受歡迎?)拋出JavaScript異常的標準做法是什麼?

+2

你可能會發現這個問題有幫助:http://stackoverflow.com/questions/783818/how-do-i-create-a-custom-error-in-javascript – Adam 2010-05-13 08:56:03

回答

10

例外可以是任何你喜歡的。

在其他語言中,異常應該是實例,然後catch語句會選擇要捕獲哪些異常並讓實例的類落入哪些異常。

但是,JavaScript不具備此功能。您只能捕獲所有例外,然後查看該值以決定如何處理它。如果您不想處理異常,則必須手動重新捕獲捕獲的值。 (這不可避免地使得catch陳述相當混亂。)

您可以決定將您的例外作爲對象實施並與instanceof進行比較。或者你可以有獨特的不透明值進行比較。或者如果你真的想要的話,你甚至可以直接扔掉字符串或數字。

是否有內置的異常類型(如NullPointerException)?

的種類。 ECMAScript定義了一些標準錯誤類別:Error及其子類型EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError。但是有瀏覽器實現問題,例如try { nonexistentvar; }在IE下給出TypeError而不是ReferenceError。還有很多其他瀏覽器特定的異常,特別是在處理DOM時。

直接使用這些對象並不是傳統的方法,並且試圖對它們進行子類化是很麻煩的(因爲JavaScript沒有類系統)。您會傾向於使用自己定義的例外來替代自己的應用。例外情況並非在JavaScript中廣泛使用。

2

您可以試試Dean Edwards的Base project。它模仿JavaScript中的類繼承,因此使用它可以使您繼承Error類型。您無法在javascript中捕獲不同類型的錯誤(因爲它不是強類型語言),但您可以確定拋出的錯誤類型,併爲該特定類型添加邏輯,如下所示:

try { 

    // do something 

} catch (e) { 

    if (e instanceof NullPointerError) { 

    // handle nullpointer exception 

    } else if (e instanceof RuntimeError) { 

    // handle runtime exception 

    } else { 

    // regular exception 

    } 
} 

當然,在這段代碼中,我假設你已經聲明瞭NullPointerError和RuntimeError類作爲Error的子類。

4

ECMA-262 specification的第15.11節定義了幾個「Error」類型,它們在運行時錯誤發生時作爲異常拋出......它們也可以作爲用戶定義的異常類的基礎對象。該規範還定義了six other error types這是該語言的一部分。

因爲它更容易確定它們的類型,所以似乎最好拋出這些類型的異常(或從它們派生的類型);他們也有一個內置的消息屬性。

根據我自己的經驗,try/catch塊有點罕見,並且感覺非常特殊,而不像Java中那樣不可避免。

相關問題