2011-11-03 5 views
12

मैं जावास्क्रिप्ट में बेजोड़ अपवाद और ब्राउज़र चेतावनियों के लिए हैंडलर लिखने की कोशिश कर रहा हूं। बाद की समीक्षा के लिए सभी त्रुटियों और चेतावनियों को सर्वर पर भेजा जाना चाहिए।क्या कंसोल घटनाओं को सुनने के लिए जावास्क्रिप्ट में कोई तरीका है?

रखरखाव वाले अपवाद पकड़ा जा सकता है और आसानी से

console.error("Error: ..."); 

या

console.warn("Warning: ..."); 

तो वे समस्या नहीं हैं के साथ प्रवेश किया है अगर वे से JavaScript कोड, और भी अधिक, बिना क्रिया अपवादों के साथ पकड़ा जा सकता कहा जाता है कोड की यह शांति:

window.onerror = function(){ 
    // add to errors Stack trace etc. 
    }); 
} 

तो अपवाद बहुत कॉव हैं ered लेकिन मैं चेतावनी के साथ अटक गया है जो ब्राउज़र कंसोल भेजता है। उदाहरण के लिए सुरक्षा या एचटीएमएल सत्यापन चेतावनी। नीचे दिए गए उदाहरण गूगल क्रोम कंसोल से लिया जाता है

पेज https://domainname.com/ पर http://domainname.com/javascripts/codex/MANIFEST.js से असुरक्षित सामग्री भाग गया।

यह बहुत अच्छा होगा अगर खिड़की जैसे कुछ घटनाएं हों। आतंक लेकिन चेतावनियों के लिए। कोई विचार?

+0

मैं एक ही बात सोच रहा था:

आप इस तरह प्रत्येक कार्य सांत्वना की (और के लिए सभी ब्राउज़रों) के व्यवहार को फिर से परिभाषित कर सकते हैं। नकारात्मक संसाधन अनुरोध परिणामों को लॉगिंग करना भी बहुत अच्छा होगा। :) – SimplGy

उत्तर

12

आप बस console विधियों को स्वयं लपेट सकते हैं। उदाहरण के लिए, एक सरणी में प्रत्येक कॉल रिकॉर्ड करने के लिए: एक ही समारोह है कि आप console.log() करने के लिए उपयोग कर रहे हैं

var logOfConsole = []; 

var _log = console.log, 
    _warn = console.warn, 
    _error = console.error; 

console.log = function() { 
    logOfConsole.push({method: 'log', arguments: arguments}); 
    return _log.apply(console, arguments); 
}; 

console.warn = function() { 
    logOfConsole.push({method: 'warn', arguments: arguments}); 
    return _warn.apply(console, arguments); 
}; 

console.error = function() { 
    logOfConsole.push({method: 'error', arguments: arguments}); 
    return _error.apply(console, arguments); 
}; 
+2

मैं इस पर सोच रहा था, लेकिन यह मेरी कुछ अपेक्षाओं के लिए काम नहीं करेगा, उदाहरण के लिए, जबकि सबकुछ सुरक्षित पृष्ठ में लोड होता है, मुझे कुछ असुरक्षित सामग्री लोड होने पर बहुत सारी चेतावनियां मिलती हैं, और यह ब्राउज़र से आता है, जावास्क्रिप्ट कोड नहीं। इसके अलावा मैं बेवकूफ आईई को कवर करना चाहता हूं (यही कारण है कि यह मेरे दिमाग में आया) और कंसोल वहां अपरिभाषित है। वैसे भी आपको मुझसे वोट मिला :) –

+0

आईई के लिए 'var message = Array का उपयोग करें।prototype.slice.apply (तर्क)। join (''); वापसी _error (संदेश); ​​'आदि –

0

, बस एक वेब सेवा है कि आप पर लॉग रिकॉर्ड कर रहे हैं के लिए एक ही संदेश पोस्ट ।

+0

कोई विकल्प नहीं है, यह महंगा है, अगर पृष्ठ में 100 त्रुटि और चेतावनियां हैं, तो क्या मुझे प्रत्येक AJAX अनुरोध के लिए बनाना चाहिए, मुझे ऐसा नहीं लगता कि –

+0

@ मिलनजरिक, आपका आपत्ति नहीं है समझ। यदि आप कंसोल आउटपुट कैप्चर कर रहे हैं, तो भी आप 100 AJAX कॉल कर रहे होंगे। –

+0

नहीं, मैं इसे एक चर (ऑब्जेक्ट) में रख रहा हूं और जब उपयोगकर्ता पृष्ठ छोड़ने वाला है तो यह डेटा को बैक एंड पर पोस्ट करेगा। –

0

आप इस पीछे के बारे में जा रहे हैं। अवरोध उत्पन्न कर रहा एक त्रुटि लॉग होता है जब करने के बजाय, त्रुटि हैंडलिंग तंत्र के हिस्से के रूप घटना ट्रिगर और घटना श्रोताओं में से एक के रूप में यह लॉग इन करें:

try 
{ 
    //might throw an exception 
    foo(); 
} 
catch (e) 
{ 
    $(document).trigger('customerror', e); 
} 

function customErrorHandler(event, ex) 
{ 
    console.error(ex) 
} 
function customErrorHandler2(event, ex) 
{ 
    $.post(url, ex); 
} 

इस कोड jQuery का उपयोग करती है और एक उदाहरण के रूप में उपयोग के लिए सख्ती से oversimplified है ।

+0

jQuery विकल्प नहीं है, अगर यह लोड करने में विफल रहता है :) –

+0

@MilanJaric, तो क्या होगा यदि आपका त्रुटि-संभाल कोड लोड करने में विफल रहता है? क्या होगा यदि आपका AJAX-log-to-डेटाबेस कॉल विफल हो जाए? –

+0

यह नहीं होगा कि यह ' ' –

2

अधिक लधु रास्ता:

// this method will proxy your custom method with the original one 
 
function proxy(context, method, message) { 
 
    return function() { 
 
    method.apply(context, [message].concat(Array.prototype.slice.apply(arguments))) 
 
    } 
 
} 
 

 
// let's do the actual proxying over originals 
 
console.log = proxy(console, console.log, 'Log:') 
 
console.error = proxy(console, console.error, 'Error:') 
 
console.warn = proxy(console, console.warn, 'Warning:') 
 

 
// let's test 
 
console.log('im from console.log', 1, 2, 3); 
 
console.error('im from console.error', 1, 2, 3); 
 
console.warn('im from console.warn', 1, 2, 3);

0

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन यह भी उपयोगी हो सकता है दूसरों के समाधान के रूप में पुराने ब्राउज़र के साथ संगत नहीं हैं।

// define a new console 
var console = (function(oldCons){ 
    return { 
     log: function(text){ 
      oldCons.log(text); 
      // Your code 
     }, 
     info: function (text) { 
      oldCons.info(text); 
      // Your code 
     }, 
     warn: function (text) { 
      oldCons.warn(text); 
      // Your code 
     }, 
     error: function (text) { 
      oldCons.error(text); 
      // Your code 
     } 
    }; 
}(window.console)); 

//Then redefine the old console 
window.console = console; 
संबंधित मुद्दे

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