2012-02-28 11 views
6

मैंने त्रुटियों को पकड़ने के लिए window.onerror हैंडलर सेट किया है। इसका उद्देश्य? हर बार एक त्रुटि होती है जब एक त्रुटि होती है, तो दूसरा हैंडलर window.onunload इसे सर्वर पर भेजता है। (संभवतः सभी त्रुटियों के साथ)।खिड़की के अंदर त्रुटियों को पकड़ना। आतंक?

समस्या है, यह केवल क्योंकि पहली बार के लिए onerror हैंडलर घटना आग के बाद, त्रुटि पकड़ नहीं है और इस तरह स्क्रिप्ट समाप्त हो जाता है, पहले ओवर त्रुटि भेजने में सक्षम है ...

वहाँ एक है इस के आसपास रास्ता?

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

कृपया कुछ कोड संलग्न करें। –

+1

हां, कोशिश/पकड़ ब्लॉक का उपयोग करें। – Christian

+0

इसे फिर से सैम कहें, यह पहली बात थी जिसके बारे में मैंने सोचा था, हां, कोशिश/पकड़ ब्लॉक का उपयोग करें। – Codebeat

उत्तर

10

एक अलग <script> टैग में यह जोड़ें, ताकि window.onerror अन्य स्क्रिप्ट टैग में स्क्रिप्ट त्रुटियों से परेशान नहीं है।

DEMO

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

ऊपर बंद नहीं होता त्रुटि कृपया ध्यान दें ब्राउज़र कंसोल में लॉग इन किया जा रहा है .. इसके बाद के संस्करण कोड सिर्फ त्रुटियों को ट्रैक करने के है .. आप किसी भी विशिष्ट में त्रुटियों को संभालने के लिए try...catch का उपयोग करना चाहिए वर्गों।

DEMO - यह दिखाने के लिए कि काम नहीं करता है जब आपके पास यह निष्पादन संदर्भ पर होता है।

+0

यह वास्तव में काम नहीं कर रहा है, (अप्रत्याशित रूप से), यह अभी भी केवल एक त्रुटि को संभालने वाला है। नए से पहले एक और स्क्रिप्ट टैग में इसे चाबुक किया है। – Baconbeastnz

+0

@Baconbeastnz window.onerror के लिए जेएस हैंडलर कोड पोस्ट करें। –

+0

वास्तव में ... क्या यह समझ में नहीं आता है कि यह केवल एक बार आग लगती है? यदि वास्तविक स्क्रिप्ट के साथ मेरी स्क्रिप्ट ब्लॉक में कई त्रुटियां होती हैं, तो उस स्क्रिप्ट को बाहर निकलता है, लेकिन मेरा हैंडलर स्क्रिप्ट ब्लॉक नहीं करता है। लेकिन क्योंकि दूसरा बाहर निकला था, अब यह पकड़ने वाला नहीं है। तो सीमा प्रति ब्लॉक एक त्रुटि है? – Baconbeastnz

संबंधित मुद्दे