2009-03-27 15 views
33

मेरे पास कुछ विशेष अपवाद मामले हैं जिन्हें मैं फेंकना और पकड़ना चाहता हूं, इसलिए मैं अपनी अपवाद कक्षाओं को परिभाषित करना चाहता हूं।अपने स्वयं के अपवाद वर्गों को परिभाषित करने के लिए सर्वोत्तम अभ्यास?

इसके लिए सर्वोत्तम अभ्यास क्या हैं? क्या मुझे std::exception या std::runtime_error से प्राप्त होना चाहिए?

उत्तर

25

हाँ, यह std::runtime_error से inherit या other standard exception classesstd::logic_error की तरह, std::invalid_argument और इतने पर, अपवाद के प्रकार पर निर्भर करता है यह है एक अच्छा व्यवहार है।

यदि सभी अपवाद std::exception से कुछ तरीके से प्राप्त होते हैं तो catch(const std::exception &e) {...} द्वारा सभी सामान्य त्रुटियों को पकड़ना आसान होता है। यदि आपके पास कई स्वतंत्र पदानुक्रम हैं तो यह अधिक जटिल हो जाता है। विशेष अपवाद वर्गों से प्राप्त करने से इन अपवादों में अधिक जानकारी होती है, लेकिन यह वास्तव में कितना उपयोगी है कि आप अपना अपवाद हैंडलिंग कैसे करते हैं।

+6

स्थिरांक रेफरी द्वारा पकड़ने: पकड़ (std :: अपवाद स्थिरांक और ई) –

+0

हाँ, कि बेहतर है, इसे बदल ... – sth

1

मेरी राय में इससे कोई फर्क नहीं पड़ता कि आप std :: अपवाद से हैं या नहीं। मेरे लिए अपवादों को परिभाषित करने के बारे में सबसे महत्वपूर्ण बात ये है:

  1. अपवाद वर्ग नाम उपयोगी और स्पष्ट होने के बाद।
  2. स्पष्ट रूप से दस्तावेज (टिप्पणियां लिखना) जब अपवाद किसी फ़ंक्शन या क्लास विधि द्वारा फेंक दिया जाएगा। मेरी राय में अपवाद प्रबंधन में यह सबसे बड़ी विफलता बिंदु है।
1

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

6

मैं एक सी ++ डेवलपर नहीं कर रहा हूँ, लेकिन एक बात हम अपने सी # कोड में किया था अपवाद निर्माता में फेंक दिया हमारे ढांचे के लिए एक आधार वर्ग अपवाद बनाने के लिए, और फिर लॉग इन करें था:

public FrameworkException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     log.Error(message, innerException); 
    } 

    ... 

किसी भी ली गई अपवाद को केवल इसके मूल कन्स्ट्रक्टर का आह्वान करना पड़ता है और हमें लगातार अपवाद लॉगिंग मिलती है। एक बड़ा सौदा नहीं, लेकिन उपयोगी है।

+0

आप हालांकि फैंसी अपवादों के साथ सावधान रहना होगा, खासकर जब अपवाद ही के निर्माण के अपवाद फेंक सकता है। – Herbert

3

यह एक अच्छा है जब कुछ दायरे में अपवाद रखा जाता है। उदाहरण के लिए कक्षा मैनिपुलेशन अपवाद वर्ग त्रुटि के भीतर घोषित कर सकते हैं त्रुटि।

और उनकी तरह

catch (const Manipulation::InputError& error) 
catch (const Manipulation::CalculationError& error) 

पकड़ने ऐसे मामलों में वे किसी भी अतिरिक्त त्रुटि जानकारी जब तक आप डिजाइन के बिना सिर्फ खाली कक्षाओं हो सकता है उनमें से किसी अपवाद ज्यादा ऊपरी उड़ जहां सभी मानक अपवाद को पकड़ने के लिए अनुमति देता है।

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