2010-09-16 16 views
21

मुझे आश्चर्य है कि अपवादों को पकड़ने का बेहतर तरीका कौन सा है: क्या यह एक __try/__except ब्लॉक या कोशिश/पकड़ ब्लॉक है?ब्लॉक या कोशिश/पकड़ ब्लॉक को छोड़कर __try/__ का उपयोग करने के लिए बेहतर क्या है?

मैं सी में लिख रहा हूँ ++ और कार्यक्रम केवल Windows पर इस्तेमाल किया जाएगा, ताकि पोर्टेबिलिटी कोई मुद्दा नहीं है।

धन्यवाद!

उत्तर

12

आप एक try/catch ब्लॉक का उपयोग करना चाहिए।

जैसा कि अन्य ने पहले से ही उत्तर दिया है, __try/__except सामान्य अपवादों को पकड़ने के लिए एसईएच (विंडोज़ उत्पन्न त्रुटियों) को पकड़ने के लिए है।

सबसे महत्वपूर्ण बात यह है कि __try और __catch सी ++ विनाशक नहीं चला सकते हैं या अपवाद को फेंकने पर स्टैक को सही ढंग से खोल सकते हैं।

दुर्लभ मामलों को छोड़कर, आपको कभी भी एसईएच अपवादों को पकड़ने की कोशिश नहीं करनी चाहिए।

संपादित करें: ठीक है, मैं इस पर सकारात्मक था (यह हमेशा मुझे बताया गया है), लेकिन @ हंस का कहना है कि स्पष्ट रूप से एक कंपाइलर स्विच है जिसे आप इसे बदलने के लिए उपयोग कर सकते हैं। मुझे लगता है कि /EHa पर डॉक्स भ्रामक हैं, या कम से कम अपूर्ण हैं, यहां क्या होता है। अगर कोई निश्चित दस्तावेज पाता है जो यह गलत साबित करता है, तो मैं खुशी से इस उत्तर को हटा दूंगा।

यहां तक ​​कि अगर यह पता चला है यह झूठ है, आप अभी भी try और catch बस क्योंकि वे मानक हैं का उपयोग करते हुए __try और __except नहीं हैं चाहिए।

+0

तो यह ढेर को अनदेखा नहीं करता है? इसका मतलब यह है कि क्रैश रिपोर्टिंग सिस्टम के अलावा किसी अन्य चीज़ के रूप में '__try'/'__except' का उपयोग करना संभवतः एक बहुत बुरा विचार है, जबकि' try' /' catch' ब्लॉक में अपवाद से पुनर्प्राप्त करने में सक्षम होना आम है। –

+2

@ डेविड: यह सही है। '__try' और' __except' कड़ाई से एक सी आधारित एपीआई/एबीआई हैं। –

+0

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

38

वे दो बहुत अलग बातें हैं। कोशिश करें/पकड़ें परिचित सी ++ कीवर्ड हैं जिन्हें आप जानते हैं। __try/__except एसईएच अपवादों को पकड़ने के लिए प्रयोग किया जाता है। विंडोज़ द्वारा उठाए गए अपवाद, जैसे डिवीजनबीज़र या एक्सेसविलेशन। इसके लिए MSDN Library article में अच्छी तरह वर्णित है।

आप इसे C++ अपवाद को पकड़ने के लिए भी उपयोग कर सकते हैं क्योंकि यह विंडोज एसईएच सुविधा का लाभ उठाता है। हालांकि आप इसे हटाए गए अपवाद ऑब्जेक्ट को नहीं निकाल सकते हैं, इसलिए यदि आप वास्तव में अपवाद को संभालना चाहते हैं तो शून्य संदर्भ होगा। पागलपन कौन सा है। नंबर एक दृष्टिकोण एसईएच अपवादों को कभी पकड़ना नहीं है, वे हमेशा सकल होते हैं। यदि आपको दो से शादी करने की आवश्यकता है तो एसईएच अपवाद को सी ++ अपवाद में बदलने के लिए _set_se_translator() का उपयोग करें।

+3

+1। –

6

__try/__except Win32 सी कोड है जो अपवाद का समर्थन नहीं करता है, लेकिन तंत्र से निपटने के लिए एक संरचित त्रुटि कोड का उपयोग करता है/फोन करने के लिए बनाया गया है। __try/__except सी त्रुटियों को एक अपवाद ब्लॉक समान में C++ कोशिश/पकड़ने के लिए अनुवाद करेगा।

अधिक जानकारी के लिए this MSDN article देखते हैं।

+0

+1 MSDN के लिए –

4

स्टैंडर्ड सी ++ का उपयोग करता है की कोशिश/पकड़ ब्लॉक, तो मैं, यदि आप "मानक" अपवाद तंत्र की जरूरत है, उनका इस्तेमाल की सिफारिश करेंगे मानक सी ++ पुस्तकालय पर आधारित है।

हालांकि, अगर आप विंडोज एसडीके के माध्यम से प्रदान संरचित एक्सेप्शन हैंडलिंग उपयोग करने के लिए (here देखें) की योजना है, तो __try/__except का उपयोग करें।

+0

-1 रेफरी: एसटीएल कुछ नहीं अपवाद हैंडलिंग से कोई लेना देना नहीं है। –

+2

एसटीएल में अपवाद हैंडलिंग के साथ बिल्कुल कुछ करना है: std :: अपवाद, जो अपवादों के लिए अनुशंसित आधार वर्ग है, भले ही यह अनिवार्य नहीं है। –

+0

'std :: अपवाद' एक एसटीएल वर्ग नहीं है। –

1

एक बार जब आप कुछ फेंक देते हैं, तो अब आपके पास इसे पकड़ने के बारे में अधिक पसंद नहीं है। यदि आप सी ++ अपवाद फेंकते हैं (यानी।, throw साथ), तो try/catch का उपयोग करें। आप Windows अपवाद हैं (जैसे, RaiseException के साथ) फेंक, तो __try/__except का उपयोग करें। उन्हें मिश्रण करने की कोशिश करने से आपके जीवन में अनावश्यक परेशानी होगी। एमएसडीएन रेफरी के लिए

+3

लेकिन आपको विंडोज अपवादों को कभी नहीं फेंकना चाहिए क्योंकि वे ढेर को अनदेखा नहीं करते हैं। –

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