मैं जावास्क्रिप्ट में एक अपवाद को कैसे हटा सकता हूं, लेकिन स्टैक को संरक्षित कर सकता हूं?


151

जावास्क्रिप्ट में, मान लें कि मैं अपवाद होने पर कुछ सफाई करना चाहता हूं, लेकिन अपवाद को स्टैक तक प्रचारित करना जारी रखें, जैसे:

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

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

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

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

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


जवाबों:


78

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

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

मैं किसी भी समाधान का पता नहीं है।

मैं अंत में समस्या नहीं देख रहा हूँ। मैं अपवादों को चुपचाप कुछ देर के बाद कुछ मामलों में त्रुटि कंसोल पर नहीं दिखा रहा हूं, लेकिन ऐसा लगता है कि एक विकास बिल्ड में तय हो गया है।


5
यह मुद्दा तब से बंद है।
ज़ाचरी बर्न्स

24

त्रुटि ऑब्जेक्ट की स्टैक प्रॉपर्टी उसी समय बनाई जाती है, जब एरर ऑब्जेक्ट खुद ही होता है, उस बिंदु पर नहीं जिसे वह फेंका जाता है। वे अक्सर मुहावरे के कारण समान होते हैं

   नई त्रुटि फेंकें ("संदेश");

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


5
यह सच नहीं है (शायद प्लेटफ़ॉर्म आश्रित)। जेएस इंजन का उपयोग कर रहा हूं (राइनो) मूल स्टैक को खोने के बाद स्टैक को फेंक स्टेटमेंट पर रीसेट करता है।
टेड बिगहम

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