2013-07-31 60 views
1

我還是比較新的JavaScript,來自更經典的(即Java,也是ActionScript 3.0)背景。我發現在庫/框架的API的錯誤實現中,將事情進一步分解爲調用堆棧是很常見的,但沒有明確指出它是應用程序代碼(而不是庫代碼)破壞事情。例如,一個jQuery.trigger()調用可能會調用引發錯誤的處理程序,並且該調用不會包含在try-catch中(也不會實現任何其他類型的錯誤保護),並且會阻止所有其他處理程序從射擊。爲什麼JavaScript庫不經常使用try-catch塊?

我理解錯誤應該中止執行,但它似乎像庫中的代碼可以在應用程序代碼得到更好的沙盒,我更經常看到這種斷裂的JS庫比我使用過其他語言。

+1

一個詞:性能。 – Pointy

回答

4

首先,因爲這是一個痛苦抓到一個例外:

try { 
    doSomething(); 
} catch(e) { 
    if (e instanceof SomeException) { 
     // handle SomeException 
    } else { 
     throw e; // and lose stacktrace information :-(
    } 
} 

接球所有異常通常是一個錯誤的事情。其次,由於JavaScript自身的異常層次在區分不同類型的錯誤和提供關於它們的信息屬性方面很差。 JavaScript更喜歡做一些你可能可能的意思,當它不是時會悄悄地破壞,而不是提出一個錯誤(參見undefined等)。它在瀏覽器之間歷史上也是不一致的(特別是DOM例外)。這意味着沒有使用異常的文化,並且繼承到庫設計中。

+1

@Mike:嘿。 jQuery是現實世界中如何使用異常的一個很好的例子:它使用catch-all來獲取瀏覽器的實現錯誤,這些錯誤不可能被嗅探到。 – bobince

1

什麼bobince說,而且,即使在你的函數中提到try-catch目前意味着該函數中的任何內容都不會被優化。請參閱here,請注意,JSPerf並不意味着顯示幅度,在優化代碼和未優化代碼之間可能高達1000倍(或其他)差異。你可以在測試中加入更多的代碼,你會發現相對差異越來越大。

參見V8 sourceSpiderMonkey bug

這是從例如根本不同僅僅提到try-catch的Java在性能方面並沒有真正影響任何東西,但是當發生異常時,您付出了代價(然後它並不重要)。