2012-02-28 12 views
6

Przygotowałem procedurę obsługi window.onerror, aby wykryć błędy. Tego cel? Aby uzyskać ciąg znaków za każdym razem, gdy wystąpi błąd, inny program obsługi window.onunload wysyła go do serwera. (Przypuszczalnie ze wszystkimi błędami).Błędy przechwytywania wewnątrz window.onerror?

Problem w tym, że to tylko w stanie wysłać w ciągu pierwszego błędu, ponieważ po onerror Zdarzenie obsługi po raz pierwszy, błąd nie zostanie złapany, a tym samym skrypt kończy ...

Czy istnieje sposób obejścia tego?

ErrorManager: (function() { 
     function Init(message) { 
      InitErrorHandler(); 
      InitAjaxHandler(); 
      setTimeout("Interface.ErrorManager.SendErrorsToAjax()", 8000); 
     } 
     function InitErrorHandler() { 
      Data.ErrorHandlerText = ""; 
      Data.ErrorHandlerCount = 0; 
      window.onerror = function(errorMessage, url, line) { 
       if(IsInIgnoreList(errorMessage)) { return; } 
       Data.ErrorHandlerText += ("Error: "+(Data.ErrorHandlerCount+1)+" <br /><br />"); 
       //Get error specific info 
       Data.ErrorHandlerText += escape(errorMessage) + "<br />"; 
       Data.ErrorHandlerText += escape(url) + "<br />"; 
       Data.ErrorHandlerText += escape(line) + "<br />"; 
       Data.ErrorHandlerCount++; 
       console.log("BOOM"+errorMessage); 
      } 
     } 

     function InitAjaxHandler() { 
      window.onbeforeunload = function() { //when browser closed 
       Data.ErrorHandlerCount > 0 && SendErrorsToAjax(); 
      } 
     } 
     function SendErrorsToAjax() { 
      PrepareErrorsForAjax(); 
      $.getJSON(Interface.Utility.PrefixURL('/ajax/sendfeedback/handlejserrors/'+Data.ErrorHandlerText)); 
     } 
     function IsInIgnoreList(str) { 
      return str.indexOf('nsIDOMSVGLocatable') != -1 ? true : false; 
     } 

     function PrepareErrorsForAjax() { 
      var preText = "<br /><br />A user has encountered a few errors: <br /><br />"; 
      //Get session info 
      var userAgent, activePageID, accountNO, consumerNO; 
      userAgent = escape(navigator.userAgent); 
      preText += "User agent: "+userAgent+" <br />"; 

      if($.mobile.activePage) { 
       activePageID = $.mobile.activePage.attr('id'); 
       preText += "Page ID: "+activePageID+" <br />"; 
      } 
      //Get info that may or may not be set 
      console.log("AUTH JSON "+Data.authJSON); 
      console.log("CONSUMER JSON "+Data.authJSON.consumers); 
      if(Data.authJSON && localStorage.lastConsumerNo) { 
       preText += "Account Number: " +Data.authJSON.accountId+" <br />"; 
       preText += "Consumer Number: "+ localStorage.lastConsumerNo+" <br />"; 
      } 
      preText += "<br /> The following errors were encountered:<br /><br />"; 
      Data.ErrorHandlerText = preText + Data.ErrorHandlerText; 
     } 
     return { 
      Init: Init, 
      SendErrorsToAjax: SendErrorsToAjax 
     } 
    })(), 
+0

Proszę załączyć kod. –

+1

Tak, użyj bloków try/catch. – Christian

+0

Powiedz to jeszcze raz, to była pierwsza rzecz, o której myślałem, Tak, używaj bloków try/catch. – Codebeat

Odpowiedz

10

Dodaj go w oddzielnym <script> tagu, tak że window.onerror nie przeszkadza błędów skryptów w innych tagów skryptu.

DEMO

<script> 
    var trackErrorMsg = ''; 
    window.onerror = function(msg, url, lineNo) { 
     trackErrorMsg += msg;  
    } 
</script> 

Uwaga błędu powyżej nie przestaje być zalogowany konsoli przeglądarki .. Powyższy kod jest tylko do śledzenia błędów .. Należy używać try...catch do obsługi błędów w jakiś konkretny Sekcje.

DEMO - Aby pokazać, że nie działa, gdy masz go w tym samym kontekście wykonania.

+0

To nie działa, (nieoczekiwanie), nadal obsługuje tylko jeden błąd. Napakowałem go w inny znacznik skryptu przed nowym. – Baconbeastnz

+0

@Baconbeastnz Napisz kod obsługi js dla window.onerror. –

+0

Infact ... czy to nie ma sensu, że strzela tylko raz? Jeśli w moim bloku skryptu wystąpi wiele błędów z rzeczywistą logiką, to TAK skrypt zostanie zakończony, ale mój blok skryptu obsługi nie. ale ponieważ ten drugi został wyprowadzony, już go nie złapie. Więc limit to jeden błąd na blok? – Baconbeastnz

Powiązane problemy