Preserving original StackTrace/LineNumbers in .NET Exceptions -


पूर्व और फेंक के बीच के अंतर को समझना, क्यों मूल स्टैकट्रेस इस उदाहरण में संरक्षित है:

  स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {try {LongFaultyMethod ()} } पकड़ (System.Exception पूर्व) {Console.WriteLine (ex.StackTrace); }} स्थिर शून्य LongFaultyMethod () {{int x = 20; SomethingThatThrowsException (x); } पकड़ (अपवाद) {फेंक; }} स्थिर शून्य कुछ ऐसा कुछ है जो त्रिभुज अपवाद (int x) {int y = x / (x - x); }  

लेकिन इस में नहीं:

  स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {try {LongFaultyMethod ()} } पकड़ (System.Exception पूर्व) {Console.WriteLine (ex.StackTrace); }} स्थिर शून्य LongFaultyMethod () {{int x = 20; Int y = x / (x - 20); } पकड़ (अपवाद) {फेंक; }}  

दूसरा परिदृश्य, पूर्व के रूप में एक ही उत्पादन का उत्पादन करेगा?

दोनों ही मामलों में, एक लाइन संख्या को देखने की उम्मीद है जहां y आरंभ किया जाता है।

< P> मुझे यकीन नहीं है कि यह सीमा सी # भाषा, सीएलआई, या इनके माइक्रोसॉफ्ट कार्यान्वयन के भीतर है, लेकिन आपका दूसरा उदाहरण एक ऐसा मामला है जहां अपवाद के लिए एक स्पष्ट कॉल। अन्तर्निर्मित पद स्टैक्सट्रेस आवश्यक है के रूप में निम्न पोस्ट में प्रलेखित चूंकि यह विधि आंतरिक है , आम तौर पर प्रतिबिंब के माध्यम से इसे बुलाया जाना चाहिए

संदर्भ:

संपादित करें: ECMA-335 विभाजन I §12.4.2 (अपवाद हैंडलिंग) और विभाजन III §4.24 (rethrow) का पुन: विश्लेषण करने के बाद, मुझे अब विश्वास है कि आप जो व्यवहार देख रहे हैं वह एक सिमेंटिक त्रुटि है सीएलआर (सीएलआई के माइक्रोसॉफ्ट के कार्यान्वयन) में व्यवहार का एकमात्र विशिष्ट संदर्भ "ए <कोड> पुनर्स्थापना ऑब्जेक्ट में स्टैक ट्रेस को परिवर्तित नहीं करता है।" यहां वर्णित मामले में, पुनर्स्थापक वास्तव में स्टैक ट्रेस को बदल रहा है, जिससे कि रिज़र्वस्टैक्सट्रेस को एक सीएलआर दोष के लिए एक वैकल्पिक हल बना देता है।

  स्थिर शून्य लॉन्गफ़ॉल्टा पद्धति () {Try {int x = 20; Int y = x / (x - 20); } पकड़ (अपवाद पूर्व) {प्रेस्सेस्टस्टैक्सट्रेस (पूर्व); // & lt; - इस लाइन को फेंक दें; }}  

PreserveStackTrace यहां से उस ब्लॉग प्रविष्टि में से एक का अनुकूलन है:

  निजी स्थिर रीडोनली एक्शन & lt; अपवाद & gt; _internalPreserveStackTrace = (एक्शन और लेफ्टिनेंट; अपवाद & gt;) प्रतिनिधि। बनाएं (टाइपफ (एक्शन और लेफ्टिनेंट; अपवाद & gt;), टाइपफ (अपवाद) .GetMethod ("इंटरनल प्रोसेसरस्टाकट्रेस", "बाइंडिंग फ्लेग्ज.इनस्टेंस | बाईंडिंगफ़्लैग। नॉन पब्लिक)"); सार्वजनिक स्थिर शून्य PreserveStackTrace (अपवाद ई) {_internalPreserveStackTrace (e); }  

Comments

Popular posts from this blog

MySql variables and php -

php - Laravel - Overriding a resource route into a different route filter group -

url rewriting - How to implement the returnurl like SO in PHP? -