Подтвердить что ты не робот

Получите все ошибки 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, повторяющийся, если обнаружены ошибки

4b9b3361

Ответ 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 был установлен после кода, который создал ошибку, а не до.