我使用我的第一个全局错误处理程序进行ajax调用,在那里我获取错误信息,将其发送到PHP脚本然后记录结果:
$(document).ajaxError(function(event, request, settings){
//get the error and log the results
var file = window.location.href;
var verbose_error;
verbose_error = 'Ajax error: ' + request.responseText + '\n\n';
verbose_error += 'Status:' + request.status + '\n\n';
verbose_error += 'Status Text:' + request.statusText + '\n\n';
verbose_error += 'Url: ' + settings.url + '\n\n';
verbose_error += 'Data: ' + settings.data + '\n\n';
verbose_error += 'Data Type: ' + settings.dataType + '\n\n';
$.post(getUrl() + 'error/log-ajax-error',{file : file,verbose_error : verbose_error},function(o){
});
});
当我为PHP脚本执行错误处理时,我可以获得堆栈跟踪以查看实际导致错误的函数。假设我的所有ajax调用都是在其他函数中执行的,我是否可以获得导致有问题的ajax调用的函数名称?
例如,在下面的代码中,如果$ .post返回错误,我希望能够访问名称badAjaxCall,然后将其放在我的日志中以帮助调试。
function badAjaxCall() {
$.post(url,data,function(o){
});
}
答案 0 :(得分:2)
创建new Error()
并获取stack
。哟将拥有所有细节。
只要您没有throw
错误,最终用户就不会注意到它。
如果您想在浏览器控制台中获得反馈,也可以throw error
。
function foo() {
baz();
}
function baz() {
foobar();
}
function foobar() {
var error = new Error();
alert(error.stack)
}
foo();
如果是异步,则会有所不同 如果您在XHR处理程序中创建错误,则不会获得任何堆栈 因此,您必须在发送XHR之前创建错误,然后在XHR处理程序中获取堆栈(如果需要)。
function foo() {
baz();
}
function baz() {
foobar();
}
function foobar() {
var error = new Error();
//setTimeout represent your XHR call
setTimeout(function() {
alert(error.stack)
}, 100)
}
foo();
在你的情况下,这将是:
function ajaxCallWrapper(url, data, handler) {
//never call direct $.post
//instead always call this function to do an xhr call
var error = new Error();
$.post(url, data, function(o){
if(o.error) {
//in case of error, show the stack
alert(error.stack);
return;
}
//otherwise call the handler
handler(o);
});
}
function badAjaxCall() {
ajaxCallWrapper(url,data,function(o){});
}
function normalAjaxCall() {
ajaxCallWrapper(url,data,function(o){});
}