2009-09-03 17 views
14

का उपयोग कर सी ++ अपवाद को पकड़ने में असमर्थ मेरे पास एक तृतीय-पक्ष लाइब्रेरी है जो कभी-कभी अपवाद फेंकती है। तो मैंने अपने कोड को कोशिश/पकड़ (...) में लपेटने का फैसला किया ताकि मैं अपवाद के बारे में जानकारी लॉग कर सकूं (कोई विशिष्ट विवरण नहीं, बस यह हुआ।)कैच (...)

लेकिन किसी कारण से, कोड अभी भी दुर्घटनाओं। क्लाइंट कंप्यूटर पर, यह कड़ी मेहनत करता है और कैच में अपवाद लॉग करने के लिए कोड (...) कभी निष्पादित नहीं होता है। अगर मैं इसे अपनी डीबग/विकास मशीन पर चलाता हूं तो मुझे पॉपअप मिलता है अगर मैं डीबग करना चाहता हूं। जब मैं ऐसा करता हूं, तो यह 0xC0000005 की रिपोर्ट करता है: उल्लंघन उल्लंघन स्थान XXX का उपयोग करें।

अजीब बात यह है कि तीसरे पक्ष की लाइब्रेरी के पुराने संस्करण के साथ, सटीक वही कोड अपवाद को पकड़ता है, और अपवाद लॉग करने के लिए कोड निष्पादित करता है। (मैं एक ही परिस्थितियों में देख वी.एस. के भीतर इस सत्यापित।)

यहाँ छद्म कोड है कि क्रियान्वित कर रहा है:

तो मैं दो प्रश्न हैं:

  1. वहाँ कुछ परिवर्तन है जिस तरह से तीसरे पक्ष ने पुस्तकालय संकलित किया हो सकता है ताकि मेरा कोड अपवाद को पकड़ने में सक्षम न हो? (हां, एक मौका है कि मैं तीसरे पक्ष को जो भी फिक्स जरूरी कर सकता हूं और मेरे लिए पुन: संकलित कर सकता हूं, अगर मुझे पता है कि उन्हें क्या कहना है।)

  2. मान लीजिए कि मैं इसे ठीक करने के लिए तीसरी पार्टी नहीं प्राप्त कर सकता , इन अपवादों को पकड़ने के लिए मैं क्या कर सकता हूं? मैं लाइनों के साथ सोच रहा हूं ... क्या यह निर्धारित करने के लिए कोई तरीका है कि पॉबजेक्ट को हटा दिया गया था या नहीं?

उत्तर

11

AFAIK एक्सेस उल्लंघन अपवाद नहीं फेंकता है ... कम से कम मानक नहीं!

शायद पकड़ने windows-विशिष्ट "मूल" अपवाद मदद मिलेगी: http://www.gamedev.net/reference/articles/article2488.asp

+0

वाह यह वास्तव में उपयोगी लेख है, और वास्तव में मेरे लिए एक व्यावहारिक समाधान है ... पुरानी पुस्तकालय को वीएस2003 के तहत बनाया जाना था, और नई पुस्तकालय वीएस -2008 के लिए है - महत्वपूर्ण अंतर। W/विकल्प संकलित करने के लिए मेरी लाइब्रेरी सेट करने के बाद "सी ++ अपवाद सक्षम करें: हाँ एसईएच अपवाद (/ ईएचए) के साथ" मेरा कोड अब इस उदाहरण को पकड़ता है। इस कारण से मैं इस प्रतिक्रिया को सही उत्तर दे रहा हूं। मैं कहना चाहता हूं कि कई अन्य उत्तरों वैध उपयोगी जानकारी प्रदान करते हैं, विशेष रूप से "जारी रखने में ज्यादा उपयोग नहीं ..." तो सभी को धन्यवाद! –

+4

सी ++ प्रयास/पकड़ के साथ एसईएच अपवादों को पकड़ना आम तौर पर एक बुरा विचार है। एक कारण है कि एमएस ने अपने नए कंपाइलर्स में डिफ़ॉल्ट रूप से अक्षम क्यों किया। आम तौर पर, आपको उस कंपाइलर विकल्प को सक्षम करने के बजाय एसईएच संरचनाओं (जैसे __try/__ को छोड़कर) का उपयोग करना चाहिए। – jalf

+0

माइकल ब्रै> कोई समस्या नहीं, मुझे लगता है कि यहां बहुत सारे उत्तर हैं जो इस तरह की समस्याओं में मदद करते हैं। मैं अन्य लोगों के लिए भी इस जवाब के तहत उन्हें बनाने के लिए वोट दूंगा। आधा> वास्तव में। लेख में वे यही करते हैं। – Klaim

0

आप क्या वर्णन) बहुत ज्यादा की तरह :: समाप्त (लग रहा है सी ++ क्रम से बुलाया जा रहा है।

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

यदि ऐसा है तो लाइब्रेरी का एक नया संस्करण प्राप्त करने का एकमात्र तरीका है जहां अपवादकर्ताओं के बाहर अपवाद नहीं हैं। आप इसे आसानी से सत्यापित कर सकते हैं - पुस्तकालय लोड होने के बाद कॉल :: set_terminate() और अपना स्वयं का फ़ंक्शन प्रदान करें और जांचें कि इसे आपके प्रोग्राम क्रैश होने से पहले कहा जा रहा है या नहीं।

1

क्या आप __try

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

8

एक एक्सेस उल्लंघन एक C++ अपवाद नहीं है। यह एक खिड़कियां संरचित अपवाद है। यदि आप उन्हें पकड़ (...) में पकड़ना चाहते हैं तो आपको _set_se_translator() का उपयोग करना होगा।

आपको शायद सभी कारणों से पकड़ना चाहिए (...) बुरा है और सुनिश्चित करें कि आप वास्तव में ऐसा करना चाहते हैं।

+0

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

+0

ओउप्स मेरा मतलब क्रीम द्वारा लेख में संदर्भ था। माफ़ कीजिये! –

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