我正在使用window.onerror和window.onbeforeunload来传递用户会话中遇到的所有错误,我正在尝试测试它,我需要创建一些javascript错误来测试它是否正在捕获我尝试过像var a = b; (其中b不存在)问题是这些错误似乎是致命的并且停止任何进一步处理......
任何人都可以想到在不停止脚本处理的情况下导致错误的好方法吗?
ErrorManager: (function () {
function Init(message) {
InitErrorHandler();
InitAjaxHandler();
}
function InitErrorHandler() {
Data.ErrorHandlerText = "";
Data.ErrorHandlerCount = 0;
window.onerror = function(errorMessage, url, line) {
Data.ErrorHandlerText +"Error: "+(Data.ErrorHandlerCount+1)+" \n\n";
//Get error specific info
Data.ErrorHandlerText += escape(errorMessage) + "\n";
Data.ErrorHandlerText += escape(url) + "\n";
Data.ErrorHandlerText += escape(line) + "\n";
Data.ErrorHandlerCount++;
}
}
function InitAjaxHandler() {
window.onbeforeunload = function() { //when browser closed
if(Data.ErrorHandlerCount > 0) {
SendErrorsToAjax();
}
}
}
function SendErrorsToAjax() {
PrepareErrorsForAjax();
$.getJSON(Interface.PrefixUrl('/sendjserrors/'+Data.ErrorHandlerText), AjaxCallback);
}
function AjaxCallback(response) {
console.log('response of js error ajax request '+response);
}
function PrepareErrorsForAjax() {
var preText = "A user has encountered a few errors: \n\n";
//Get session info
var userAgent, activePageID;
userAgent = escape(navigator.userAgent);
preText += "User agent: "+userAgent+" \n";
if($.mobile.activePage != null) {
activePageID = $.mobile.activePage.attr('id');
preText += "Page ID: "+activePageID+" \n";
}
preText += "\n The following errors were encountered:\n\n";
Data.ErrorHandlerText = preText + Data.ErrorHandlerText;
}
return {
Init: Init,
SendErrorsToAjax: SendErrorsToAjax
}
})(),
答案 0 :(得分:4)
在JavaScript中,所有错误都被视为致命错误。退出当前代码块(<script>
标记或外部文件),页面继续从</script>
标记开始。
我不确定try...catch
块是否会触发onerror
。
答案 1 :(得分:3)
怎么样
throw new Error( 'No worries. Just testing...' );
如果你不想让你的程序破解,你必须抓住它。
答案 2 :(得分:1)
谢谢你们,在你说过的事情之后玩了一遍,就像Kolink说的那样,一旦遇到错误,剧本基本上会退出,远远不够理想。
你可以通过以下方式测试onerror:
setTimeout("Interface.ErrorManager.SendErrorsToAjax()", 2000);
var a = b; //create an error
//script exists here, but the timeout still bounces in in a few seconds