【问题标题】:How to catch exceptions thrown in callbacks passed to jQuery?如何捕获传递给jQuery的回调中抛出的异常?
【发布时间】:2012-03-25 15:56:33
【问题描述】:

我想捕获从传递给 jQuery(click 等事件处理程序,或then 或 always 等 jqXHR 方法)的回调引发的异常。

我已经确定了两个选项:

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

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

还有其他选择吗?

【问题讨论】:

    标签: javascript jquery exception-handling callback


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 2019-09-18
      • 1970-01-01
      • 2011-04-10
      • 2016-07-21
      • 2017-10-14
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多