2016-08-03 3 views
6

शीर्षलेख <stdexcept> कुछ मानक अपवादों को परिभाषित करता है। हालांकि, मुझे यह चुनने में परेशानी है कि कौन सा अपवाद उपयोग करना है। क्या ऑनलाइन पाए जाने के लिए अच्छे दिशानिर्देश हैं? मैं अपनी समस्या को उदाहरण के साथ चित्रित करने का प्रयास करता हूं:सी ++ किस (मानक) अपवाद का उपयोग कब करें?

एक समारोह में एक नया वेक्टर लौटने के लिए एक (भौतिक) वेक्टर और कोण (0 और पीआई के बीच) की लंबाई लगती है। यदि कोण नकारात्मक है तो

  1. std::invalid_argument, नकारात्मक कोण अवैध हैं?
  2. std::logic_error, क्योंकि नकारात्मक कोण इस मामले में समझ में नहीं आता है?
  3. std::out_of_range, क्योंकि नकारात्मक कोण कोण के लिए अनुमत सीमा के बाहर हैं?
  4. std::domain_error, क्योंकि गणितीय फ़ंक्शन को नकारात्मक कोणों पर परिभाषित नहीं किया गया है।
  5. या मुझे एक कस्टम अपवाद परिभाषित करना चाहिए?

: - ये अपवाद

+0

यह पूरी तरह से आपके ऊपर है। इससे कोई फर्क नहीं पड़ता कि अपवादों को फेंक दिया जाता है, जब तक वे पकड़े नहीं जाते हैं, वे समस्या को रोक देंगे। तो, जो भी अपवाद आप तय करते हैं कि आप फेंकने जा रहे हैं, आप कहीं पकड़ने जा रहे हैं। तो, यह पूरी तरह से आप पर निर्भर है। –

+0

आप अपनी त्रुटियों को मानक मानकों से अलग करने के लिए अपने अपवाद प्रकारों को पेश करना चाहेंगे। – Jarod42

+0

ठीक है, मुझे अपने दिशानिर्देशों को समझना है। क्या अधिक विस्तृत विवरण हैं जिनके लिए मानक अपवादों का इरादा शुरू किया गया था। दोनों [cppreference.com] पर विवरण (http://en.cppreference.com/w/cpp/header/stdexcept) और [cplusplus.com] (http://www.cplusplus.com/reference/stdexcept/) बहुत संक्षिप्त हैं। –

उत्तर

7

इरादों (में मामला किसी चमत्कार here यदि आप रुचि रखते हैं मैं एक triclinic सिमुलेशन बॉक्स है, जो वास्तव में तीन लंबाई और तीन कोण हैं में निर्देशांक को बदलने के लिए कोशिश कर रहा हूँ।) :

std::invalid_argument:

वस्तु का एक प्रकार अपवाद के रूप में फेंक दिया करने के लिए निर्धारित करता है। यह त्रुटियों की रिपोर्ट करता है जो उत्पन्न होते हैं क्योंकि एक तर्क मान स्वीकार नहीं किया गया है।

std::logic_error:

परिभाषित वस्तु का एक प्रकार अपवाद के रूप में फेंक दिया है। यह त्रुटियों की रिपोर्ट करता है जो प्रोग्राम के भीतर दोषपूर्ण तर्क का परिणाम हैं जैसे तार्किक पूर्व शर्त या कक्षा आविष्कारों का उल्लंघन करना और रोकथाम हो सकता है।

कोई मानक पुस्तकालय घटकों इस अपवाद सीधे फेंक, लेकिन अपवाद टाइप std::invalid_argument, std::domain_error, std::length_error, std::out_of_range, std::future_error, और std::experimental::bad_optional_accessstd::logic_error से हुआ है।

std::out_of_range:

परिभाषित वस्तु का एक प्रकार अपवाद के रूप में फेंक दिया है। यह त्रुटियों की रिपोर्ट करता है जो परिभाषित सीमा से तत्वों तक पहुंचने के प्रयास के परिणामस्वरूप हैं।

std::domain_error:

परिभाषित वस्तु का एक प्रकार अपवाद के रूप में फेंक दिया है। इसका उपयोग डोमेन त्रुटियों की रिपोर्ट करने के लिए कार्यान्वयन द्वारा किया जा सकता है, यानी, ऐसी परिस्थितियां जहां इनपुट डोमेन के बाहर होते हैं जिस पर एक ऑपरेशन परिभाषित किया जाता है।


यह देखते हुए कि, मैं अपनी स्थिति के लिए std::logic_error और std::out_of_range के उपयोग से इनकार करेगा।

std::ivalid_argumentstd::domain_error से कम विशिष्ट है। इसलिए, मेरी सिफारिश std::domain_error का उपयोग करना होगा।

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