2012-02-28 10 views
6

He configurado un controlador window.onerror para detectar errores. ¿Su propósito? Para concatenar una cadena cada vez que se produce un error, otro controlador window.onunload lo envía al servidor. (Presumiblemente con todos los errores).¿Hay errores de captura dentro de window.onerror?

El problema es que es sólo capaz de enviar el primer error más, porque después de las onerror activa el evento de controlador, por primera vez, el error no se detecta y así termina la secuencia de comandos ...

¿Existe una camino alrededor de esto?

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

Por favor, adjunte un código. –

+1

Sí, use los bloques try/catch. – Christian

+0

Dígalo otra vez, Sam, eso fue lo primero que pensé, sí, use los bloques try/catch. – Codebeat

Respuesta

10

añadirlo en un <script> etiqueta independiente, de manera que window.onerror no está preocupado por los errores de script en otras etiquetas de script.

DEMO

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

por favor el error anterior no deja de ser conectado en la consola del navegador .. El código anterior solo es realizar un seguimiento de los errores .. Debe utilizar try...catch para controlar los errores en cualquier específica secciones

DEMO - Mostrar que no funciona cuando lo tiene en el mismo contexto de ejecución.

+0

Eso no funciona, (inesperadamente), solo está manejando un error. Lo ha batido en otra etiqueta de script antes de la nueva. – Baconbeastnz

+0

@Baconbeastnz Publique el código del controlador js para window.onerror. –

+0

De hecho ... ¿no tiene sentido que solo se dispare una vez? Si se producen múltiples errores en mi secuencia de comandos con lógica real, entonces esa secuencia de comandos se cierra, pero el bloque de secuencia de comandos del manejador no lo hace. pero debido a que el otro se salió, no va a atrapar más. ¿Entonces el límite es un error por bloque? – Baconbeastnz

Cuestiones relacionadas