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

时间:2012-03-08 04:49:28

标签: javascript jquery exception-handling callback

我想捕获从传递给jQuery的回调抛出的异常(要么是click之类的事件处理程序,要么是thenalways等jqXHR方法。

我发现了两个选项:

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

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

还有其他选择吗?

1 个答案:

答案 0 :(得分: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)));
}