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

How to catch exceptions thrown in callbacks passed to jQuery?

本文关键字:回调 异常 jQuery 何捕获      更新时间:2023-09-26

我想捕获从传递给jQuery的回调中抛出的异常(要么传递给像click这样的事件处理程序,要么传递给thenalways这样的jqXHR方法)。

我已经确定了两个选项:

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

我唯一能想到的另一件事是重写jQuery方法,但这可能会在我升级jQuery时导致问题。对于AJAX处理程序,我可能会使用$.ajaxSetup(根据jQueryAJAX回调中抛出的异常的答案?),但我不确定这是否能让我捕获所有内容。

还有其他选择吗?

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

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