gpt4 book ai didi

javascript - 获取页面上所有 javascript 错误/javascript 错误处理

转载 作者:行者123 更新时间:2023-12-03 02:19:22 29 4
gpt4 key购买 nike

我希望能够向自己发送页面上的所有 JavaScript 错误。我是一名扩展开发人员,因此以下内容重点强调在调用 dom 之前确保 dom 已准备好。

我研究了向 throw 添加一些功能来发送或邮寄异常,但我发现这是不可能的。

1:主要解决方案,window.onerror 处理程序:

window.onerror = function(e, url, line){
mailError('onerror: ' + e + ' URL:' + url + ' Line:' + line);
console.error('\nLine ' + line + ':');
setTimeout(function(){retry();}, 100); //mainly useful in content scripts for extensions,
return true;
}

可能还需要通过 jQuery 做同样的事情:

$(window).error( 
function(e, url, line){
//handle error
}
);

这样做的缺点是您的代码已停止执行。

为了避免错误停止执行,最好使用回调来确保代码按特定顺序执行,并尽可能利用事件。您还可以使用一些技术来保护 dom 调用

$(document).ready({
//you usually won't get bad dom calls wrapping your code in this
});

您还可以考虑在 window.onload 上运行代码

window.onload = function(){
//you page will probably twitch upon executing code at this time
//but you will almost never have a bad dom call
};

另一种技术

if (document.getElementById('iNeedThisElement')) {
//doin work!
document.getElementById('iNeedThisElement').style.display = 'block';
} else {
var stillNeedToTakeCareOfX = true; //false otherwise since it's undefined
mailError('iNeedThisElement was unavailable...');
}

使用这些技术并调试您的应用程序,您应该会做得很好。由于无法检索 console.error、.warn 和 .log 语句并将其报告给您,因此下面提供了一个小型替代套件:

var Xe = { }; //Extreme error suite

function extraInfo(e){
//e optional
if(!e)e = true;

//add an extra debug info, such as navigator or current URL
return ' currentURL: '+ document.URL +
'\n userAgent: ' + navigator.userAgent +
'\n platform: ' + navigator.platform +
'\n userid: ' + localStorage.userid +
'\n language: ' + navigator.langauge +
'\n cookies?: ' + navigator.cookiesEnabled;
}

Xe.error = function(e){
console.error(e); //maintain original functionality
mailError('Xe err: ' + e + extraInfo() );
}


Xe.warn = function(e){
console.warn(e);
mailError('Xe warn: ' + e + extraInfo() );
}


Xe.log = function(e){
console.log(e);
mailError('Xe log: ' + e + extraInfo() );
}

作为最后的手段,您可以不断尝试执行一段代码,直到它执行时没有错误为止。这是下面的“2”。

2:将代码分成大块,并在捕获错误后尝试在 x 秒后重新执行,或继续执行下一个代码块

//defExe = DEFinitely EXEcute this code
//functionArg, reference to a function holding a large chunk of code
//seconds, timeout in milliseconds to re-attempt error free execution of this function
function defExe(functionArg, seconds) {
//seconds is optional
if (!seconds)seconds = 300;

try {
functionArg();
} catch(e) {
//mail the error plus extra info
mailError('caught ' + e + ' attempting to re-execute ' + functionArg.name + ' in ' + seconds + ' milliseconds');

//re-attempt to execute this code
setTimeout(function(){
defExe(functionArg, seconds);
}, seconds);
}
}

然后使用它就像

//array to group function chunks
var fn = [ ];

fn[1] = function (){
//a large chunk of javascript
}
defExe(fn[1]);

fn[2] = function(){
//another chunk of your program
}
defExe(fn[2]);

#2 摘要:将代码分组在函数中并在 try-catch block 中运行,如果捕获到错误则重复

最佳答案

我有我的window.onerror,它不会停止我的javascript:

window.onerror = function(error, url, line) {
controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line});
};

请注意,controller.sendLog 是一个将此数据发送到日志记录 php 的函数。

可能是因为您在该函数内导致了一些 JavaScript 错误?

关于javascript - 获取页面上所有 javascript 错误/javascript 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970475/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com