我正在尝试发出ajax请求,并在失败时抛出异常。不幸的是我无法捕获异常。我的代码如下所示:
try {
jQuery.ajax('http://www.someurlthatwillproduceanerror.com')
.fail(function () {
throw 'an exception';
})
.done(function () {
console.log('ok');
})
;
} catch (e) {
console.log(e);
}
我希望代码能够捕获异常并将“异常”记录到控制台。相反,我最终得到了一个未被捕获的例外。
在这种情况下有谁知道如何处理异常?
答案 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()函数,无论是在服务器端还是客户端。