在异步调用中抛出错误时,在tryAjax()
上下文消失后抛出错误,因此永远不会达到我的catch子句。
有没有办法正确捕获非同步异常?
function tryAjax(){
try{
didItWork();
}
catch(e){
// Do something else
}
}
function didItWork(){
$.ajax({
url: url,
success: function (res, status, xhr)
{
// Do something
},
error: function (e)
{
throw new Error('Canvas video not loaded');
}
});
};
}
答案 0 :(得分:2)
有没有办法正确捕获非同步异常?
到异常发生时,控件已经移动,不再在try/catch
范围内。此外,正如您所发现的,jQuery捕获并抑制error
回调中的异常。
在这种特定情况下,通常的做法是让didItWork
接受回调或返回一个承诺,并调用该回调或用您想要的值(成功)或标志值来解析/拒绝该承诺表示失败。
这是一个承诺的例子:
function tryAjax(){
didItWork()
.done(function(data) {
// All good, use `data`
})
.fail(function(err) {
// Failed, details in `err`
});
}
function didItWork(){
var d = new $.Deferred();
$.ajax({
url: url,
success: function (res, status, xhr)
{
d.resolveWith(res);
},
error: function (e)
{
d.rejectWith(new Error('Canvas video not loaded'));
}
});
return d.promise();
}
答案 1 :(得分:1)
我会这样做:(使用延迟对象)
function tryAjax(){
didItWork().fail(function (e){ // Do something specific})
.done(function(a,b,c){//all ok});
}
function didItWork(){
return $.ajax({
url: url,
success: function (res, status, xhr)
{
},
error: function (e)
{
//something general
}
});
};
}
答案 2 :(得分:0)
您可以在AJAX
等异步调用中的任何错误时调用方法 function didItWork(){
$.ajax({
url: url,
success: function (res, status, xhr)
{
// Do something
},
error: function (e)
{
logError(e);
}
});
};
}
function logError(e)
{
//Perform activity related to error handling
}