2012-03-08 40 views
12

我想趕上從傳遞到jQuery的(無論是事件處理程序像click,或者jqXHR方法,如thenalways)回調拋出的異常。如何捕獲傳遞給jQuery的回調中引發的異常?

我已經確定了兩個選項:

  • window.onerror處理程序 - 這只是一個片面的解決方案,因爲它不支持在Android這是我的目標平臺之一
  • 每個單獨的回調中處理異常 - 根本不幹!

我能想到的唯一的其他事情就是覆蓋jQuery方法,但是隨着我升級jQuery,這可能會導致問題。對於AJAX處理程序,我可以使用$ .ajaxSetup(根據Exceptions thrown in jQuery AJAX callbacks swallowed?的答案),但我不確定這將使我能夠捕捉所有內容。

還有其他的選擇嗎?

回答

15

你可以用每個回調是這樣的:

function cbWrapper(fn) { 
    return function() { 
     try { 
      return(fn.apply(this, arguments)); 
     } catch(e) { 
      // handle all your exceptions here 
     } 
    }; 
} 

所以,當你去一個回調傳遞給Ajax調用,而不是通過實際的回調,你通過cbWrapper(callback)

$.get(url, cbWrapper(myRealCallback)); 

或者內嵌匿名版本會是這樣的:

$.get(url, cbWrapper(function() { 
    // actual callback code here 
})); 

做這將是覆蓋$.get()用自己的實現自動換回調的更先進的方式,但得到棘手因爲jQuery對於實際傳遞的參數非常靈活。因爲這個原因,你必須重寫一個特定的參數才能使它工作,所以你必須複製所有的參數檢測代碼,這些代碼會指出哪些參數存在以及哪些參數與哪些實際函數參數相對應。該代碼有點混亂。這是可行的,並且可能不會中斷,因爲如果jQuery破壞它,那麼現有的jQuery代碼將會中斷,但它不是很乾淨。

如果這都是你自己的代碼,你可以只讓你自己的版本的$.get()不是與參數的位置,以便靈活切換所有的代碼,而不是使用它的實際$.get()的:

jQuery.fn.myGet = function(url, fn) { 
    return(jQuery.get(url, cbWrapper(fn))); 
} 
相關問題