jQuery延迟:在fail()回调中抛出并捕获异常

时间:2013-11-20 10:01:19

标签: javascript jquery promise

我正在尝试发出ajax请求,并在失败时抛出异常。不幸的是我无法捕获异常。我的代码如下所示:

try {
    jQuery.ajax('http://www.someurlthatwillproduceanerror.com')
        .fail(function () {
            throw 'an exception';
        })
        .done(function () {
            console.log('ok');
        })
    ;
} catch (e) {
    console.log(e);
}

我希望代码能够捕获异常并将“异常”记录到控制台。相反,我最终得到了一个未被捕获的例外。

在这种情况下有谁知道如何处理异常?

3 个答案:

答案 0 :(得分:2)

不,你不能这样做。这不是异常处理如何与promises一起使用。

done子句中的代码不会在与try / catch相同的时间或上下文中执行。你不能在浏览器中异步捕获这样的异常(还有!)。

我的建议是处理 .fail子句作为捕获

jQuery.ajax('http://www.someurlthatwillproduceanerror.com')
    .fail(function () {
        console.log("an exception"); // the handler here!
    })
    .done(function () {
        console.log('ok');
    });

请注意,基于异常执行某些操作的代码不必与声明承诺的代码位于同一位置。

var p = jQuery.ajax('http://www.someurlthatwillproduceanerror.com');
... 
...
p.fail(function(){ /* I'm handling it here */}); // .catch in modern promise libs

一般来说,从处理promises的函数返回promise也许是一个好主意 - 这通常会产生更清晰的代码。

答案 1 :(得分:1)

您提供的fail函数抛出异常是异步执行的。

我假设您希望向调用者传播错误,因此,您应该知道延迟失败的目的是根据定义对此进行建模(传播失败,除了异步发生的错误)。

您应该将延迟的承诺返回给调用者,然后调用者可以附加自己的成功/失败回调,而不是依赖于try / catch。这是一般的延期使用示例:

function yourFunc() {
    return jQuery.ajax('http://www.someurlthatwillproduceanerror.com')
        .done(function () {
            console.log('ok');
        });
}

yourFunc().fail(function() { console.log('this... instead of a try/catch.'); });

答案 2 :(得分:-1)

也许您正试图将所有错误处理代码放在一个地方。如果是这样,你可以利用jQuery的ajax方法(或get或其他)实现promise接口的事实,并将任何有风险的代码放在then函数中

以下是:

jQuery.ajax('http://www.someurlthatwillproduceanerror.com/but/only/maybe')

  .then(function(data, textStatus, jqXHR) {
    // This function handles the response. It is NOT called if the AJAX fails.
    console.log('ok');

    /** An optional result object to pass to your done() function */
    var result;

    try {
      // Code that might blow up goes here
      result = 'The final result';
    } catch (e) {
      // Oh no—it blew up!
      // Reject the promise with the function signature of an AJAX failure
      return $.Deferred().reject(jqXHR, textStatus, e);
    }

    // We only get this far if there wasn't an exception.
    return result; // Optional
  })

  .done(function(result) {
    // This function gets called if there were no problems at all.
    alert('Well, that\'s just ducky! Contact the vendor ' +
        'and tell them to promote their devs!');
    console.log('Woo-hoo!', result);
  })

  .fail(function(jqXHR, textStatus, errorThrown) {
    // This function gets called if the AJAX failed, or if there was an exception
    alert('Something went wrong. Contact the vendor ' +
        'and tell them to give their devs more money!');
    console.error('Rats!', jqXHR, textStatus, errorThrown);
  });

这样,对于任何意外错误都有一个fail()函数,无论是在服务器端还是客户端。