2012-05-28 29 views
4

我想知道您對我製作的函數的看法,它包裝對象的每個方法,添加「try catch」處理程序以在服務器端記錄JavaScript錯誤。關於在JavaScript中使用「try catch」封裝每個方法的性能問題

我不想使用window.onerror,因爲這個security restriction,我的腳本將託管在CDN上的不同域上。

/* 
* object: Object to be wrapped 
* errorHandler: Instance of ErrorHandler Object 
*/ 
function addLog(object, errorHandler) { 
    var name, method; 

    for (name in object) { 
     method = object[name]; 
     if (typeof method === "function") { 
      object[name] = function(method, name) { 
       return function() { 
        try { 
         return method.apply(this, arguments); 
        } catch (ex) { 
         ex.message += "; method: '" + name + "'"; 
         errorHandler.addToStack(ex.message); 
         throw ex; 
        } 
       }; 
      }(method, name); 
     } 
    } 
    return object; 
} 

errorHandler.addToStack是異步發送錯誤報告給使用Ajax消息的服務器的自定義對象的方法。

我想包裝實例對我有此功能的應用程序中的每個對象,但我不知道:

  • 這是一個不好的做法?
  • 它有性能問題嗎?
  • 有沒有更好的方法來做到這一點?

在此先感謝!

回答

1

我認爲最好的辦法是通過防止發生添加驗證和檢查錯誤,以避免嘗試catch語句,但如果你真的需要做這個方式,我不認爲它會有一個很好的性能問題。

在這裏,我做了一個jspref測試來衡量它,並且差異只顯示在IE中,但它不是很顯着。

我不知道errorHandler方法是否有性能問題或放慢你的代碼,但如果它是異步的,我想這不會是一個問題。

+0

我有點困惑(並且好奇):在這個測試中,你的「封閉嘗試」在什麼意義上涉及try/** catch **? AFAICT它不會做任何這樣的事情... – delicateLatticeworkFever

+0

對不起@goldilocks,我忘了添加它!我剛剛解決了這個問題,並且它拋出了類似的結果。仍然沒有太大的區別。只有我不明白的是,爲什麼在Chrome中它運行得更快,關閉和try catch聲明!?!?!?! –

+0

有趣的鉻和良好的性能測試(我是+1),但爲什麼你在測試2中使用自動執行功能(nb,「閉包」是一個更一般的概念)?我在其中添加了「修訂2」,其中「簡單嘗試」實際上「不嘗試」和「簡單嘗試」幾乎相同。也就是說,「關閉嘗試」和「不嘗試」之間的區別似乎與try/catch無關;)http:// jsperf。com/try-catch-performance-closure/2 *當你測試某個東西時,只需測試它,而不是它+其他不相關的東西。* – delicateLatticeworkFever

1

與Java等更嚴格的代碼不同,Javascript並不需要try/catch來實現大多數對象的實例化。如果出現問題,它往往只是不工作,並且不會爆炸或終止於你。

然而,有些部件會結束函數,所以更好的方法是將代碼作爲一個整體用try/catch包圍起來,這樣它就會默默地失敗,並使用catch來喚醒原始代碼錯誤報告。

+1

我不需要隱藏失敗的錯誤,在'errorHandler.addToStack(ex.message);'之後注意'throw ex;'。我只需要將錯誤信息發送到服務器端日誌。感謝您的回答! –

0

您仍然可以使用全局try/catch將日誌發送到服務器,因爲異常對象包含信息。

但是錯誤的對象不是瀏覽器之間的標準,我覺得