2014-06-19 5 views
5

मेरे पास दो उदाहरण हैं। पहले मामले में, डिबगर बिना क्रिया का अपवाद पकड़ता:अपवादों को प्रयास/पकड़ संदर्भ में स्टैकट्रैक का हिस्सा खोना

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    throw new Exception(); 
} 

और अपवाद पूर्ण स्टैकट्रेस है:

at ConsoleApplication28.Program.Exec() 
    at ConsoleApplication28.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

दूसरे मामले:

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    try { 
     throw new Exception(); 
    } 
    catch (Exception ex) { 
    } // Breakpoint 
} 

ब्रेकप्वाइंट पर अपवाद कम है स्टैकट्रैक:

at ConsoleApplication28.Program.Exec() 

दूसरे मामले में युक्त विधि में स्टैकट्रैक क्यों कट किए जाते हैं, और इसे कैसे रोकें? मुझे बग्रेपोर्ट्स के लिए पूर्ण स्टैकट्रैक की आवश्यकता है, अन्यथा कभी-कभी यह संभव नहीं है कि समस्या पूरी तरह से बिना स्टैकट्रस के हो।

+0

"मुझे बग्रेपोर्ट्स के लिए पूर्ण स्टैकट्रैक की आवश्यकता है, अन्यथा कभी-कभी यह संभव नहीं है कि समस्या पूरी तरह से बिना स्टैकट्रस के हो।" अपने प्रश्न के उस हिस्से का जवाब देने के लिए, आपको "उपरोक्त" कहीं भी एक प्रयास-पकड़ संरचना डालना होगा जहां अपवाद हो सकता है, संभवतः शीर्ष पर, आपकी मुख्य() विधि में। कैच क्लॉज में आपको कुछ फ़ाइल या बाद के विश्लेषण के लिए कुछ अपवाद ऑब्जेक्ट.ToString() लिखना चाहिए। – RenniePet

उत्तर

3

जो आप विजुअल स्टूडियो डीबगर में देख रहे हैं वह अनचाहे अपवाद है कि विजुअल स्टूडियो होस्टिंग प्रक्रिया फँस रही है (यानी पहले दो स्टैक फ्रेम के बाद सबकुछ उस वीएस "होस्ट प्लंबिंग" का हिस्सा है)। यदि आप होस्टिंग प्रक्रिया को अक्षम करते हैं (प्रोजेक्ट गुण-> विजुअल स्टूडियो होस्टिंग प्रक्रिया सक्षम करें), तो आपको दोनों परिदृश्यों में एक "छोटा" स्टैक ट्रेस दिखाई देगा (इसके बावजूद कि आप अपने दूसरे मामले में Main के लिए स्टैक फ्रेम नहीं देखेंगे क्योंकि अपवाद "हैंडल" है, Main तक प्रचार करने की अनुमति नहीं है)। यह छोटा स्टैक ट्रेस स्टैक ट्रेस है जिसे आप देखेंगे कि क्या आप डीबगर के बाहर एप्लिकेशन चला रहे थे।

स्टैक काम करता है जैसा कि आप कल्पना करेंगे - प्रत्येक विधि कॉल उस पर एक और स्टैक फ्रेम डालती है, और विधि के अंत में इसके स्टैक फ्रेम को "पॉप" किया जाता है, या स्टैक से निकाल दिया जाता है। अपवाद पर आप जो स्टैक ट्रेस देखते हैं वह फ्रेम से स्टैक फ्रेम से बना होता है जहां अपवाद फेंक दिया जाता है, उस फ्रेम पर वापस जहां अपवाद अंततः संभाला जाता है, क्योंकि ढेर "अवांछित" होता है।

+0

आप इस उत्तर को फिर से व्यवस्थित करना चाहते हैं कि यह स्पष्ट रूप से इंगित करता है कि स्टैक ट्रेस का कौन सा हिस्सा होस्टिंग प्रक्रिया के कारण है और जो कैच ब्लॉक के कारण है। फिर आप जोर दे सकते हैं कि अपर्याप्त ट्रैवर्स स्टैक स्तर के रूप में स्टैक निशान एकत्र किए जाते हैं, इसलिए 'मुख्य' भाग अभी तक नहीं है। –

+0

लेकिन क्यों मुख्य() दूसरे स्टैकट्रैक में नहीं है? मुझे यह नहीं मिला। मैंने System.Diagnostics.StackTrace और Main() द्वारा अपवाद के बिंदु पर स्टैकट्रैक की जांच की है। –

+2

अपवाद स्टैक ट्रेस उस बिंदु तक स्टैक ट्रेस है जहां अपवाद पकड़ा जाता है। उस स्टैक ट्रेस को अपवाद के रूप में बढ़ता है क्योंकि कॉल स्टैक के स्तर ऊपर बुलबुले होते हैं। यह दिखाता है, "आज तक स्टैक ट्रेस क्या है", न कि "कार्यक्रम की शुरुआत में कॉल स्टैक क्या है"। –

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