2016-06-07 65 views
0

我想擴展使用try/catch的第三方函數,所以如果出現錯誤我可以在內部記錄它。我似乎無法擴展或原型功能記錄錯誤,有沒有人有這樣的例子?使用try/catch擴展第三方函數

googletag.cmd.push = function(a) { 
    try { 
     for (var b = sa(), c = 0; c < arguments.length; ++c) try { 
      ea(arguments[c]) && (arguments[c](), this.j++) 
     } catch (d) { 
      this.l++, b.error(Ta(String(d.message))) 
     } 
     b.info(Ua(String(this.j), String(this.l))); 
     return this.j 
    } catch (d) { 
     // custom error logging. 
     O(1001, d) 
    } 
} 
+0

上面的代碼您的預期結果與'O'是你的錯誤處理函數?初始代碼是什麼? –

+0

最初的代碼只是googletag.cmd.push,所有的功能都是內部的,我只是想基本上擴展catch(d)將錯誤保存到頁面上的javascript obj – user1572796

+0

因此'push'函數是由一個你無法控制的腳本定義的,你希望能夠調用它並檢測'push'內的錯誤? – Oriol

回答

0

純粹通過javascript不可行。

最簡單的解決方案是覆蓋自定義實現的函數,除了日誌語句外,它們是相同的。

如果您需要爲很多第三方功能執行此操作,我建議您通過codemods查看AST轉換。

+2

嘗試覆蓋/重新定義函數,但googletag.cmd.push範圍中的函數似乎存在關閉問題。即sa()未定義 – user1572796

+0

這再次不是你可以使用純JavaScript解決的問題。我想你最好的選擇是訴諸源代碼轉換。作爲一種中間措施,您可以考慮手動進行更改並在版本控制中分別存儲差異,以便可以通過GNU補丁等工具將它們應用於庫的後期版本。如果你這樣做了,除非庫改變了零件周圍的劇烈變化 - 你仍然可以相對輕鬆地進行小型升級。 – lorefnon

+0

明白了,這就是我所害怕的。謝謝 – user1572796

0

如果該函數沒有抑制錯誤,並且它正在冒泡出該函數,那麼應該可以將其捕獲。

(function(){ 
    var originalPush = googletag.cmd.push; 
    googletag.cmd.push = function(a){ 
     try{ 
      return originalPush(a); 
     }catch(e){ 
      /* logging */ 
      throw(e); 
     } 
    } 
})() 
+0

我認爲這個問題是originalPush有一個try/catch,所以它永遠不會使它進入重載函數的catch – user1572796