如何捕获传递给jQuery的回调中抛出的exception?
我想捕获从传递给jQuery的回调抛出的exception(对于像click
这样的事件处理程序,或者对于jqXHR方法,例如then
或always
)。
我发现了两个选择:
-
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))); }