2011-01-27 8 views
8

क्या कोई विशेषताएं हैं जो मैं बॉयलरप्लेट विधियों पर लागू कर सकता हूं ताकि ऐसी विधियां स्टैक निशान में दिखाई न दें? मुझे उनमें से बहुत कुछ मिला है और कुछ मामलों में वे कई स्तर गहरे हैं। यह सिर्फ चीजों को छेड़छाड़ कर रहा है।मैं संकलक को स्टैक निशान में किसी विधि को अनदेखा करने के लिए कैसे कह सकता हूं?

उदाहरण कोड: सी में Spork.Program.ThrowMe() पर

:

class Program 
{ 
    public static void ThrowMe() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void HideMe() 
    { 
     ThrowMe(); 
    } 
    static void Main(string[] args) 
    { 
     try 
     { 
      HideMe(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

यह इस स्टैक ट्रेस फेंकता \ परियोजनाओं \ XXX \ परीक्षण सैंडबॉक्स \ ConsoleTesting \ Program.cs : लाइन 58

Spork.Program.HideMe() सी में कम से : \ परियोजनाओं \ XXX \ परीक्षण सैंडबॉक्स \ ConsoleTesting \ Program.cs: लाइन 64

012,

Spork.Program.Main पर (String [] args) C: \ परियोजनाओं \ XXX \ परीक्षण सैंडबॉक्स \ ConsoleTesting \ Program.cs: लाइन 70

+10

क्या आप पूछ रहे हैं कुछ मामलों में सुविधाजनक है और दूसरों में एक दुःस्वप्न है। कल्पना करें कि कोई और आपके स्टैक ट्रेस को पढ़ रहा था और देखा कि 'मुख्य' जिसे 'थ्रोमे() 'कहा जाता है। फिर वे 'मुख्य' की जांच करते हैं लेकिन यह नहीं देख सकते कि वह कॉल कहां बनाया गया है। साथ ही, कल्पना करें कि 'मुख्य' 500 लाइन लंबी है इसलिए यह आपके नमूने के रूप में स्पष्ट नहीं है। मैं आपके साथ सहानुभूति देता हूं लेकिन आखिरकार यह "फीचर" दुर्व्यवहार करेगा और कोडिंग एक दुःस्वप्न होगी, यही कारण है कि यह अस्तित्व में नहीं है। –

+0

एक उत्कृष्ट बिंदु। – Amy

उत्तर

7

रखो कंसोल का उपयोग कर सकते हैं कैच ब्लॉक में। राइटलाइन (ई)। रिलीज बिल्ड पर स्विच करें और Ctrl + F5 दबाएं। आप इस देखेंगे:

System.NotImplementedException: The method or operation is not implemented. 
    at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9 
    at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 

ध्यान दें कि HideMe() विधि स्टैक ट्रेस में दिखाई नहीं है। मिशन पूरा हुआ।

विधि कॉल ट्रेस में नहीं दिखाया गया था क्योंकि जेआईटी ऑप्टिमाइज़र ने विधि विधि को रेखांकित किया: यह स्टैक ट्रेस में विधियों को छिपाने का एकमात्र तरीका है।

ऐसा कुछ नहीं है जिसे आप अच्छी तरह से नियंत्रित कर सकते हैं, विधि को 'छोटा' होना चाहिए और स्वयं को कोई अपवाद नहीं फेंकना चाहिए। यह अन्यथा आमतौर पर एक समस्या माना जाता है, एक सुविधा नहीं। ए से बी

5
+5

जो उस सदस्य में पकड़े गए अपवादों पर तोड़ने से डीबगर को रोकता है, लेकिन क्या यह स्टैक ट्रेस को प्रभावित करता है? – RQDQ

+0

यह पता चला कि यह उत्तर सही था। हंस इसे आगे विस्तार से बताता है। – Amy

+1

यह विशेषता डीबगर से छिपाने वाले रैपर विधियों के लिए अद्भुत काम करती है। वे कॉलस्टैक में नहीं दिखते हैं, एक में कदम उठाने के बजाय आपको नीचे दिए गए अगले कॉल पर ले जाया जाएगा, जो आप लपेटने के लिए वैसे भी देखना चाहते हैं। – James

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

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