सभी जावास्क्रिप्ट को पकड़ना अपवादित नहीं है


112

मैं किसी एप्लिकेशन में सभी अनचाहे जावास्क्रिप्ट अपवादों को एक अलर्ट बॉक्स में प्रदर्शित करने का एक तरीका खोजने या निकालने की कोशिश कर रहा हूं। मैं यह सब क्लाइंट साइड पर करना चाहता हूं, बिना किसी सर्वर साइड कोड का उपयोग किए। मैं एक वातावरण के रूप में MVC3 का उपयोग कर रहा हूं।

मैं पिछले कुछ दिनों से शोध कर रहा हूं और मुझे वह नहीं मिला, जिसकी मुझे तलाश है।

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

http://eriwen.com/javascript/js-stack-trace/

पिछले लिंक के समान भी कुछ:

https://github.com/eriwen/javascript-stacktrace

यहां ऊपर दिए गए 2 लिंक से मूल कोड है जो एक निर्दिष्ट जावास्क्रिप्ट फ़ंक्शन के स्टैक ट्रेस को प्रिंट करता है:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

तो, यह योग करने के लिए, क्या आप सभी किसी भी तरह के 'श्रोता' के बारे में जानते हैं कि सभी जावास्क्रिप्ट को बिना किसी अपवाद के सुनने के लिए और फिर उन्हें अलर्ट बॉक्स में स्क्रीन पर प्रिंट करें?

धन्यवाद! जेसन


एक बात ... क्या आप एक चेतावनी बॉक्स का उपयोग करेंगे? आप कंसोल का उपयोग कर सकते हैं। (त्रुटि_message) ....
मैथलाइट

1
मुझे लगता है कि यह सवाल पकड़ो सभी जेएस त्रुटियों से आपको बाहर निकलने में मदद मिलेगी
Pilgerstorfer Franz

आपको शायद इस सवाल पर एक नज़र डालनी चाहिए: stackoverflow.com/questions/205688/…
मार्क

जवाबों:


129

आप window.onerror विधि का उपयोग करके ऐसा कर सकते हैं।

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
एक कोशिश / पकड़ ब्लॉक में मेरे पूरे ऐप को लपेटने की कोशिश से बेहतर है। :) धन्यवाद!
एंथनी

15
बस सिर उठाएं: "ध्यान दें कि कुछ / कई त्रुटि घटनाएं विंडो.इंटरेर को ट्रिगर नहीं करती हैं, आपको उनके लिए विशेष रूप से सुनना होगा।" - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
समारोह (ERRORMSG, यूआरएल, LineNumber) है कि कोड में समारोह का नाम (myErrorHandler) शामिल करने के लिए ... बस हो सकता है कोई जरूरत नहीं है
JoelFan

18
@JoelFan डिबगिंग उद्देश्यों के लिए फ़ंक्शन नाम रखना बेहतर है। डीबगर अनाम फ़ंक्शन के रूप में दिखाने के बजाय फ़ंक्शन नाम का उपयोग करेगा।
जेरिनॉ

यह बहुत बढ़िया है और धन्यवाद! एक जटिल फोटो-जूमिंग स्क्रिप्ट को डीबग करने की कोशिश कर रहा है जो 100% समय के लिए ठीक काम करता है, मोबाइल सफारी पर छोड़कर जहां यह बेतरतीब ढंग से विफल हो जाता है, और जहां क्या हुआ, यह देखने के लिए कोई "कंसोल" या "डेवलपर" विंडो नहीं है। सुनिश्चित करें कि मेरी अपनी "डीबग" विंडो है जिसे मैं एक गुप्त बटन के साथ चालू कर सकता हूं, लेकिन मेरे पास विश्व स्तर पर हर त्रुटि को देखने का कोई तरीका नहीं था जो मैंने 'कोशिश / पकड़' पर नहीं किया था। इस अतिरिक्त ने मुझे बिल्कुल दिखाया जहाँ समस्या थी, और मेरे बाल फाड़ने को और अधिक बढ़ा दिया! काश मैं इसे दो बार मतदान कर पाता!
रैंडी

48

आप या तो window.onerror(या आश्चर्यजनक रूप से!) 'त्रुटि' घटना को ठीक से बाँध सकते हैं:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

यदि आप JavaScript त्रुटियों को ट्रैक करना चाहते हैं, तो आप Atatus को आज़मा सकते हैं । मैं अटाटस में काम करता हूं।


7
आप "झूठे" बयान क्यों दे रहे हैं?
कुमारसेन_साद

@kumaresan_sd यह डिफ़ॉल्ट ईवेंट हैंडलर को आग लगाने की अनुमति देता है: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandler/…
Jens Bodal

29

के अतिरिक्त

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

आप ईवेंट कॉलबैक ( .then()) unhandledrejectionईवेंट के बारे में सुनकर निकाल दी गई सभी त्रुटियों को भी पकड़ सकते हैं

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
क्या दोनों का उपयोग करना आवश्यक है window.onerrorऔर window.addEventListener("error", या उनमें से एक का पर्याप्त उपयोग कर रहा है?
टॉरमॉड ह्युजेन

2
आप उनमें से एक का उपयोग कर सकते हैं। यदि आप उपयोग करते हैं window.addEventListener("error", तो उन तत्वों की त्रुटियों को पकड़ने के लिए useCaptureसेट भेजें trueजो बबल अप नहीं करते थे। developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
जेवियर पेरेज़

1
धन्यवाद!! यह errorआयोजन मेरी विशेष त्रुटि को नहीं पकड़ रहा था। unhandledrejectionहालांकि मिल गया।
जो

throw new Error('tja');इस दृष्टिकोण के साथ नवीनतम क्रोम में नहीं पकड़ा गया है ...
OZZIE

1
@JavierPerez I ने v80 का उपयोग करके परीक्षण किया और इस घटना को सीधे-सीधे एक त्रुटि बताया और इसे पकड़ा नहीं गया और इसे सिंटैक्स त्रुटियों को भी नहीं पकड़ा।
OZZIE

1

की जाँच करें http://log4javascript.org यह Log4J पर आधारित है। यदि आपका अधिकांश कोड अपवादों को संभालने के लिए कोशिश / कैच स्टेटमेंट में लपेटा जाता है, तो आप इस लाइब्रेरी का उपयोग हमेशा उपलब्ध "डायलॉग बॉक्स" या लॉगिंग विंडो में आउटपुट भेजने के लिए एक सामान्य इंटरफ़ेस के रूप में कर सकते हैं जिसे आपका अंतिम उपयोगकर्ता देख सकता है। आपके पास एक बटन भी हो सकता है जो संवाद बॉक्स की सामग्री को प्रिंटर या पीडीएफ में प्रिंट करने के लिए एक window.print () करता है। सौभाग्य।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.