2011-08-17 13 views
42

जावास्क्रिप्ट में यह शानदार कॉलबैक window.onerror है। किसी भी त्रुटि को ट्रैक करना काफी सुविधाजनक है। हालांकि, यह त्रुटि नाम, फ़ाइल नाम और रेखा के साथ कॉल करता है। यह try...catch कथन से वास्तविक त्रुटि ऑब्जेक्ट प्राप्त करने के रूप में निश्चित रूप से समृद्ध नहीं है। वास्तविक त्रुटि ऑब्जेक्ट में बहुत अधिक डेटा है, इसलिए मैं इसे प्राप्त करने का प्रयास कर रहा हूं। दुर्भाग्यवश, try...catch कथन ठीक काम नहीं करता है जब आप एसिंक कोड शुरू करते हैं।विंडो के साथ वास्तविक जावास्क्रिप्ट त्रुटि ऑब्जेक्ट प्राप्त करें। आतंक

क्या दोनों दुनिया के सर्वोत्तम संयोजन और प्राप्त करने का कोई तरीका है? मैंने शुरुआत में त्रुटि onerror ब्लॉक में ट्रिगर की गई त्रुटि प्राप्त करने का एक तरीका ढूंढ लिया, लेकिन ऐसा लगता है कि जेएस इसे संग्रहीत नहीं करता है।

कोई सुराग?

+0

पकड़ने त्रुटि setTimeout और setInveral जैसे कार्यों को ओवरराइड और एक कोशिश पकड़ पाश अंदर डाल करने के लिए: इन ब्राउज़रों आप 'त्रुटि' ठीक से इस घटना के लिए window.onerror, या (! आश्चर्यजनक) बाँध उपयोग कर सकते हैं या तो दोनों में उन्हें। आप सभी त्रुटियों को पकड़ने में सक्षम होंगे। सही बात ? –

उत्तर

10

यदि आप त्रुटि ऑब्जेक्ट के स्टैक ट्रेस का जिक्र कर रहे हैं, तो AFAIK, यह संभव नहीं है।

सरल कारण यह है कि एक स्टैक ट्रेस एक निष्पादन संदर्भ में जो क्रम अपवाद से संबंधित है (कोशिश के साथ संभाला ... पकड़ने ... अंत में) बनाया या फेंक दिया (new Error() या throw के साथ) कर रहे थे।

जबकि window.onerror कहा जाता है, इसे एक अलग संदर्भ में बुलाया जाता है।

आप अपने onerror हैंडलर में window.event (एफएफ पर उपलब्ध नहीं) का निरीक्षण करके कुछ लाभ प्राप्त कर सकते हैं।

+3

डांग। स्टैक ट्रेस वास्तव में उन चीज़ों में से एक है जिन्हें मैं ढूंढ रहा हूं:/मुझे यकीन नहीं है कि मैं समझता हूं कि यह किसी भी तरह से "लगातार" क्यों नहीं हो सकता है, क्योंकि यह तारों की एक सरणी है ... –

+0

यह जारी नहीं है क्योंकि दायरा जो इसे बनाया गया था अब वहां नहीं है। कोशिश/पकड़ने के मामले में, आप अभी भी _that_ गुंजाइश में हैं। – Mrchief

+1

इस पर एक नज़र डालें: http: //helephant.com/2007/05/12/diy-javascript-stack-trace/ आपके मामले में सहायक हो सकता है, हालांकि सुनिश्चित नहीं है। – Mrchief

46

अब कुछ ब्राउज़रों में यह संभव है। spec को 5 वें पैरामीटर के रूप में स्टैकट्रैक के साथ वास्तविक त्रुटि को शामिल करने के लिए अद्यतन किया गया था।

window.onerror = function(message, filename, lineno, colno, error) 
{ 
    if(error != null) 
    { 
     //handle the error with stacktrace in error.stack 
    } 
    else 
    { 
     //sadly only 'message', 'filename' and 'lineno' work here 
    } 
}; 
+0

क्या इस त्रुटि को एनजी-एप में निहित angular.js सेवा में पास करने का एक अच्छा तरीका होगा? – FutuToad

+4

कम से कम क्रोम, आईई 11, और फ़ायरफ़ॉक्स> = 31 पर काम करता है। मैंने अभी तक सफारी और मोबाइल संस्करणों का परीक्षण नहीं किया है। लगता है कि अब काफी अच्छी तरह से समर्थित है। – frank

+0

@ user2151819 अच्छी खबर – SuperUberDuper

5

आधुनिक ब्राउज़रों पूरी तरह से ErrorEvent और window.onerror के लिए एचटीएमएल 5 मसौदा कल्पना का समर्थन:

समस्या नहीं हर ब्राउज़र अभी तक इस का समर्थन करता है कि, तो आप कुछ इस तरह कर सकता है।

// Only Chrome & Opera pass the error object. 
window.onerror = function (message, file, line, col, error) { 
    console.log(message, "from", error.stack); 
}; 
// Only Chrome & Opera have an error attribute on the event. 
window.addEventListener("error", function (e) { 
    console.log(e.error.message, "from", e.error.stack); 
}); 
संबंधित मुद्दे