2013-11-27 6 views
9

मैं चेतावनी देने के लिए त्रुटियों को पारित करना चाहता हूं कि उपयोगकर्ता ने उनके कोड में गलती की है, भले ही उनके पास कंसोल खुला न हो।आप कंसोल संदेश और त्रुटियों को अलर्ट करने के लिए कैसे भेजते हैं?

var doc=(frame.contentWindow.document || obj.contentDocument|| obj.contentWindow); 
    var head = doc.getElementsByTagName('head')[0]; 
    var scriptElement = doc.createElement('script'); 
    scriptElement.setAttribute('type', 'text/javascript'); 
    scriptElement.text = scripts; 

    try{ 
     head.appendChild(scriptElement); 
    } 
    catch(e){ alert("error:"+e.message +" linenumber:"+e.lineNumber);} 

स्क्रिप्ट में त्रुटि होने पर appendChild एक त्रुटि फेंकता है। यह सीधे कंसोल पर जाता है, और मैं इसे एक चेतावनी में प्रदर्शित करना चाहता हूं, क्योंकि यह बच्चों के लिए है और वे कंसोल की जांच नहीं कर सकते हैं। कोशिश पकड़ने ब्लॉक त्रुटि पकड़ नहीं है। मैंने इसे eval (स्क्रिप्ट) के साथ करने की कोशिश की।

try{ 
    eval(scripts);} catch(e){ alert("error:"+e.message +" linenumber:"+e.lineNumber);} 

यह काम करता है लेकिन इसका मतलब है कि कोड दो बार निष्पादित किया गया है, और यह कुछ मामलों में बहुत असुविधाजनक है।

मैं बंदर console.error पैचिंग की कोशिश की:

 console.log=function(){alert("taking over the log");} 
     console.error=function(){alert("taking over the log");} 

लेकिन यह है कि केवल काम करता है जब मैं सचमुच console.error का उपयोग करें। जब कोई वास्तविक त्रुटि फेंक दी जाती है। वास्तविक त्रुटि के मामले में कंसोल में त्रुटि क्या त्रुटि भेजती है, अगर यह कंसोल नहीं है। आतंक? और क्या मैं इसे एक्सेस कर सकता हूं और इसे बदल सकता हूं? कोई विचार? मदद वास्तव में सराहना की जाएगी। धन्यवाद Jenita

+0

यह वास्तव में मेरे लिए काम नहीं करता है। यहां तक ​​कि इस टुकड़े की तरह सबसे सरल रूप में: – Jenita

+0

मैंने इसे नीचे – Jenita

उत्तर

12

जबकि try ... catch कोड है कि स्क्रिप्ट शुरू में चलाता है, पर काम करेंगे के रूप में Jenita कहना है कि वह पकड़ नहीं होगा सिंटेक्स त्रुटियां, और यह भी कॉलबैक फ़ंक्शंस द्वारा फेंकने वाली त्रुटियों को नहीं पकड़ेगा जो बाद में निष्पादित (ट्राइक-कैच समाप्त होने के बाद)। इसका मतलब है कि setTimeout या addEventListener पर भेजे गए किसी भी फ़ंक्शन से कोई त्रुटि नहीं है।

हालांकि, आप एक अलग दृष्टिकोण का प्रयास कर सकते हैं। विंडो पर एक त्रुटि श्रोता रजिस्टर करें।

window.addEventListener("error", handleError, true); 

function handleError(evt) { 
    if (evt.message) { // Chrome sometimes provides this 
     alert("error: "+evt.message +" at linenumber: "+evt.lineno+" of file: "+evt.filename); 
    } else { 
     alert("error: "+evt.type+" from element: "+(evt.srcElement || evt.target)); 
    } 
} 

कॉलबैक फ़ंक्शन से अपवाद फेंकने पर यह कहा जाएगा। लेकिन यह भी इस तरह के लोड करने के लिए है, जो आप में कोई दिलचस्पी नहीं हो सकता है में नाकाम रहने के चित्र के रूप में सामान्य डोम त्रुटियों पर ट्रिगर किया जाएगा।

यह भी वाक्यविन्यास त्रुटियों पर सक्रिय होना चाहिए लेकिन केवल अगर यह पहले से चलाने के लिए ताकि आप रखना चाहिए सक्षम था यह एक अलग लिपि में है जिसमें टाइपो हो सकते हैं! (एक स्क्रिप्ट में बाद में एक सिंटेक्स त्रुटि एक ही स्क्रिप्ट के शीर्ष पर वैध लाइनों को चलने से रोकती है।)

दुर्भाग्यवश, मुझे फ़ायरफ़ॉक्स में evt से लाइन नंबर प्राप्त करने का कोई तरीका नहीं मिला। (संपादित करें: चारों ओर ढकेलना, मैं इसे वहाँ अब हो सकता है लगता है।)


मैं इस खोज की जब FastJSLogger, एक में पेज लकड़हारा मैं वापस इस्तेमाल किया जब ब्राउज़र DevTools कुछ हद तक धीमी गति से थे लिखने की कोशिश कर।

लाइन नंबर को पकड़ने के लिए हताश, मैं started to experimentsetTimeout और addEventListener कि पुनः परिचय उन कॉल के आसपास कोशिश पकड़ के लिए रैपर के साथ।उदाहरण के लिए:

var realAddEventListener = HTMLElement.prototype.addEventListener; 

HTMLElement.prototype.addEventListener = function(type,handler,capture,other){ 
    var newHandler = function(evt) { 
     try { 
      return handler.apply(this,arguments); 
     } catch (e) { 
      alert("error handling "+type+" event:"+e.message +" linenumber:"+e.lineNumber); 
     } 
    }; 

    realAddEventListener.call(this,type,newHandler,capture,other); 
}; 

जाहिर है इस से पहले किसी भी घटना श्रोताओं पंजीकृत हैं किया जाना चाहिए, और संभवतः पहले भी jQuery की तरह पुस्तकालयों लोड किए गए हैं, इससे पहले कि हम बदलने के लिए सक्षम किया गया है असली addEventListener के लिए एक संदर्भ हथियाने से रोकने के लिए यह।

+1

बहुत बहुत धन्यवाद, यही वही है जो मुझे चाहिए! – Jenita

1

आप अपने स्वयं के ट्राई/कैच में स्क्रिप्ट लपेट सकता है, कुछ की तरह:

var doc=(frame.contentWindow.document || obj.contentDocument|| obj.contentWindow); 
var head = doc.getElementsByTagName('head')[0]; 
var scriptElement = doc.createElement('script'); 
scriptElement.setAttribute('type', 'text/javascript'); 
scriptElement.text = "try{"+scripts+"}catch(e){console.error(e);alert('Found this error: ' + e +'. Check the console.')}" 
head.appendChild(scriptElement); 
+0

पर चिपकाया है हाय मैंने कोशिश की लेकिन यह काम नहीं किया। क्या कोई समझता है कि एपेंड चाइल्ड के आसपास प्रयास पकड़ने की कोशिश से त्रुटि क्यों नहीं पकड़ी जाती है। ऐसा इसलिए है क्योंकि appendChild अपने कोड के बाद एक और फ़ंक्शन (शायद evals) कहता है, और वह फ़ंक्शन त्रुटि को पकड़ता है और त्रुटि को सीधे कंसोल पर भेजता है। क्या किसी को पता है कि कंसोल में त्रुटियां कैसे भेजी जाती हैं। क्या यह त्रुटि वर्ग का एक तरीका है? – Jenita

+1

असल में यह टाइपरर्स के लिए काम करता है, लेकिन सिंटैक्स त्रुटियों के लिए नहीं – Jenita

+0

यह कॉलबैक फ़ंक्शंस (जैसे सेटटाइमआउट से) या ईवेंट हैंडलर (उदा। एडवेंट लिस्टर से) द्वारा फेंकने वाली त्रुटियों के लिए भी काम नहीं करेगा। – joeytwiddle

1

ठीक है तो ऐसा करने का कम सुरुचिपूर्ण लेकिन अत्यधिक कुशल तरीका आपके सहज कंसोल फ़ंक्शंस को 'रीफैक्टरिंग' करना है। असल में आपको जो भी त्रुटि या चेतावनियां मिलती हैं उन्हें जावास्क्रिप्ट फ़ंक्शन द्वारा आउटपुट किया जा रहा है जो परिचित console.log() फ़ंक्शन के समान ही है। जिन कार्यों के बारे में मैं बात कर रहा हूं वे हैं console.warn(), console.info() और console.error()। अब चलो 'फिर से नक्शा' उन में से प्रत्येक के क्या करना: अब

//remap console to some other output 
var console = (function(oldCons){ 
    return { 
     log: function(text){ 
      oldCons.log(text); 
      //custom code here to be using the 'text' variable 
      //for example: var content = text; 
      //document.getElementById(id).innerHTML = content 
     }, 
     info: function (text) { 
      oldCons.info(text); 
      //custom code here to be using the 'text' variable 
     }, 
     warn: function (text) { 
      oldCons.warn(text); 
      //custom code here to be using the 'text' variable 
     }, 
     error: function (text) { 
      oldCons.error(text); 
      //custom code here to be using the 'text' variable 
     } 
    }; 
}(window.console)); 

//Then redefine the old console 
window.console = console; 

, आम तौर पर मैं अत्यधिक उत्पादन में कुछ इस तरह का उपयोग कर के खिलाफ सलाह और डिबगिंग उद्देश्यों तक सीमित होगा, लेकिन जब से तुम एक कार्यक्षमता विकसित करने के लिए कोशिश कर रहे हैं जो कंसोल के आउटपुट को दिखाता है, लाइनें धुंधली होती हैं, इसलिए मैं इसे आपके पास छोड़ दूंगा।

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