2009-12-12 10 views
6

स्थिति निम्नानुसार है: थ्रेड ए अपवाद को पकड़ता है, अपवाद के डेटा को मेमोरी में कहीं भी बचाता है (अपवाद फ़िल्टर में GetExceptionInformation का उपयोग करके), और बाद में थ्रेड बी को अपवाद जानकारी मिलती है और इसे फिर से बनाना चाहता है। लेकिन बात यह है कि, जब थ्रेड बी पकड़े गए अपवाद को पुनर्स्थापित करता है, तो मुझे मूल कॉल स्टैक याद आ रहा है जो अपवाद का कारण बनता है।
मैं मूल कॉल स्टैक खोए बिना अपवाद को कैसे पुनर्स्थापित कर सकता हूं? (ध्यान दें कि यह प्रश्न सी ++ के बारे में है)।मूल कॉल स्टैक खोए बिना अपवाद कैसे दोहराएं?

+0

बस यह सुनिश्चित करना चाहता था कि मुझे ऐसे उत्तर नहीं मिले जो उदाहरण के लिए सी # के लिए विशिष्ट हैं :) –

+1

कुछ समाधान सबसे निश्चित रूप से भाषा/मंच विशिष्ट हैं। सी ++ और सी # अपवाद अलग-अलग होते हैं, और सी ++ अपवाद अलग-अलग प्लेटफार्मों पर अलग-अलग लागू होते हैं। –

+0

इस [स्टैक ओवरफ्लो थ्रेड] में एक अच्छा समाधान वर्णित है (http://stackoverflow.com/questions/23820633/gdb-prevent-losing-backtrace-in-a-catch-rethrow- स्थिति) –

उत्तर

2

आप पकड़ ब्लॉक में ढेर को खोल सकते हैं और अपवाद के हिस्से के रूप में इसे सहेज सकते हैं। सी ++ में स्टैक को अनइंड करना थोड़ा मुश्किल है, लेकिन आप क्रैशडंप कलेक्टर कोड पर एक नज़र डाल सकते हैं जो कि उदाहरण के लिए WxWidgets के साथ आता है।

+0

उत्तर के रूप में चिह्नित किया गया है हालांकि मेरे मामले में पूरी तरह व्यावहारिक नहीं है –

0

प्रश्न यह है कि आपको "प्राप्त करने" धागे में ढेर को पारित करने की आवश्यकता क्यों होगी।

मुझे लगता है कि आपको मूल रूप से कुछ त्रुटि लॉग पर इसकी रिपोर्ट करने के लिए स्टैक की आवश्यकता है। आप पकड़ने वाले धागे में ढेर चल सकते हैं, या मिनी डंप का उत्पादन कर सकते हैं, या जो भी त्रुटि जानकारी आप एकत्र करना चाहते हैं, और उसके बाद प्राप्तकर्ता धागे को अपवाद की एक प्रति (यदि संभव हो, स्लाइसिंग से सावधान रहें) पास करें।

+0

अपवाद जिसे मैंने एक फोर्क-जॉइन रूटीन के अंदर पकड़ा था। इसलिए यदि कुछ कार्यकर्ता धागे में एक अपवाद फेंक दिया गया है, तो मैं इसे मुख्य धागे में पास करना चाहता हूं और वहां उसे फिर से जोड़ना चाहता हूं (+ मैं मूल ढेर खोना नहीं चाहता) –

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