Получите все ошибки javascript при обработке ошибок страницы/javascript
Я хочу иметь возможность отправлять на JavaScript все ошибки JavaScript. Я разработчик расширений, поэтому в следующем акцент делается на том, чтобы 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
}
);
Поражение этого заключается в том, что ваш код прекратил выполнение.
Чтобы избежать ошибок при остановке выполнения, лучше использовать обратные вызовы, чтобы убедиться, что код выполняется в определенной последовательности и использовать события, где это возможно. Вы также можете защитить домашние вызовы несколькими способами.
$(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 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: групповой код в больших кусках и попытка повторного выполнения через несколько секунд после обнаружения ошибки или продолжения следующего фрагмента кода
//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, повторяющийся, если обнаружены ошибки
Ответы
Ответ 1
У меня есть моя работа с window.onerror, и это не останавливает мой javascript:
window.onerror = function(error, url, line) {
controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line});
};
Обратите внимание, что controller.sendLog - это функция, которая отправляет эти данные в журнал регистрации.
Может быть, потому что вы вызываете ошибку javascript внутри этой функции?
Ответ 2
Извините, но try/catch поймает только ошибки кода, никогда не загружает ошибку (если файл отсутствует или что-то такое).
window.onerror/$(window).error, безусловно, лучшее решение.
Ответ 3
Когда в большинстве языков возникает исключение, выполнение текущего стека команд будет остановлено. Таким образом, ваш глобальный подход window.onerror работает, но не продолжает выполнять код после сбоя. Мне любопытно, почему вы ожидаете, что повторная попытка будет работать в случае, если исходный вызов не удался? Возможно, есть еще один способ оптимизировать ваше приложение, чтобы избежать этого.
Одна из вещей, которые мне нравится делать, - это перенос любого из моего кода в функцию window.onerror в блок catch try. В заявлении catch (последнее средство) я обычно использую какое-то предупреждение, на случай, если что-то катастрофически ошибочно. Идея здесь заключается в том, что вы не хотите, чтобы ваша обработка ошибок для страницы EVER заканчивалась тем, что была запущена другая ошибка.
Ответ 4
Вы также можете попробовать
Попробуйте... Catch Statement
try
{
//Run your code here
}
catch(err)
{
//Handle the errors here
}
Ответ 5
При использовании следующего кода это работает, это означает, что при возникновении ошибки функция снова вызывает себя. Когда ошибки не являются последовательными, нет проблем, может быть столько, сколько я хочу.
Однако при 2 последовательных ошибках скрипт останавливается. Кто-нибудь может мне помочь?
function example(e){
try {
//code for .... j=i+1;
}
catch(e){
example(j);
}
}
Огромное спасибо
Редактировать. Решаемые. Я идиот. Используемый j был установлен после кода, который создал ошибку, а не до.