2010-09-17 12 views
100

जावास्क्रिप्ट में, मैं कुछ सफाई प्रदर्शन करने के लिए जब एक अपवाद होता है चाहता हूँ लगता है, लेकिन अपवाद ढेर, जैसे ऊपर प्रचार करने के लिए आगे बढ़ें:मैं जावास्क्रिप्ट में अपवाद कैसे पुनर्स्थापित कर सकता हूं, लेकिन ढेर को संरक्षित करता हूं?

try { 
    enterAwesomeMode(); 
    doRiskyStuff(); // might throw an exception 
} catch (e) { 
    leaveAwesomeMode(); 
    throw e; 
} 
doMoreStuff(); 
leaveAwesomeMode(); 

इस कोड के साथ समस्या यह है कि पकड़ने और अपवाद का कारण बनता है rethrowing स्टैक ट्रेस जानकारी उस बिंदु तक खो जाने के लिए, ताकि अगर अपवाद को बाद में पकड़ा जाता है, तो ढेर पर ऊंचा हो जाता है, स्टैक ट्रेस केवल फिर से फेंक जाता है। यह बेकार है क्योंकि इसका मतलब है कि इसमें उस फ़ंक्शन को शामिल नहीं किया गया है जो वास्तव में अपवाद को फेंक देता है।

जैसा कि यह पता चला है, कम से कम क्रोम में यह वही व्यवहार है (यानी, यह फिर से फेंक नहीं है कि समस्या ठीक है, लेकिन किसी भी अपवाद हैंडलर ब्लॉक की उपस्थिति बिल्कुल भी है।)

क्या किसी को जावास्क्रिप्ट में अपवाद को पुनर्स्थापित करने के तरीके के बारे में पता है लेकिन इसके साथ जुड़े स्टैक ट्रेस को संरक्षित करता है? यह विफल होने पर, अपवाद-सुरक्षित क्लीनअप हैंडलर जोड़ने के अन्य तरीकों के लिए सुझावों के बारे में, जबकि अपवाद होने पर पूर्ण स्टैक निशान को कैप्चर करते समय भी?

किसी भी संकेत दिए गए के लिए धन्यवाद :)

+7

0x3a28213a - मेरी धन्यवाद ;-) – bacar

+0

धोखा देने के लिए इंतजार कर रहे: https://stackoverflow.com/questions/5249960/javascript-rethrowing-an-exception-preserving-the-stack-trace – MatthewMartin

+0

यह सवाल क्योंकि बंद किया जाना चाहिए यह 2012 में तय क्रोम बग को संदर्भित करता है। –

उत्तर

53

यह क्रोम में एक बग है। अपवाद को रेथ्रोइंग करना कॉल ट्रेस को संरक्षित रखना चाहिए।

http://code.google.com/p/chromium/issues/detail?id=60240

मैं किसी भी वैकल्पिक हल के बारे में पता नहीं है।

मुझे अंत में समस्या दिखाई नहीं दे रही है। मुझे अंत में कुछ मामलों में त्रुटि कंसोल पर चुपचाप अपवाद नहीं दिखता है, लेकिन ऐसा लगता है कि विकास के निर्माण में यह तय किया गया है।

+13

यह बग अब तक तय किया गया प्रतीत होता है। – mzedeler

15

एक त्रुटि वस्तु के ढेर संपत्ति त्रुटि वस्तु ही एक ही समय में बनाई गई है, बिंदु पर नहीं यह फेंक दिया है। वे अक्सर मुहावरा

 
    throw new Error("message"); 

की वजह से ही कर रहे हैं और यदि आप कोड बस के रूप में आप इसे लिखा है का उपयोग करें, ढेर संपत्ति परिवर्तित नहीं किया जाएगा जब आप त्रुटि rethrow।

+1

यह सच नहीं है (शायद मंच निर्भर)। जेएस इंजन जो मैं अब उपयोग कर रहा हूं (राइनो) मूल स्टैक खोने, फेंक स्टेटमेंट पर ढेर को रीसेट करता है। –

+0

शायद ऐसा है, लेकिन rhino-1.7.7.2.jar इसे नहीं बदलता है। आप कौन सा संस्करण उपयोग कर रहे हैं? –

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

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