如何捕获传递给jQuery的回调中抛出的exception?

我想捕获从传递给jQuery的回调抛出的exception(对于像click这样的事件处理程序,或者对于jqXHR方法,例如thenalways )。

我发现了两个选择:

  • window.onerror处理程序 – 这只是一个部分解决方案,因为在我的目标平台之一的Android上不支持它
  • 处理每个单独回调中的exception – 根本不是DRY!

我能想到的另一件事就是重写jQuery方法,但是每次升级jQuery都会导致问题。 对于AJAX处理程序,我可以使用$ .ajaxSetup(根据jQuery AJAX回调吞下的exception的答案? )但我不确定这会让我抓住所有内容。

还有其他选择吗?

您可以像这样包装每个回调:

 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))); }