अपवाद वर्गों के एक सेट के लिए एक अच्छा डिजाइन क्या है? मैं इस बात के चारों ओर सामान के सभी प्रकार देखता हूं कि अपवाद वर्गों को क्या करना चाहिए और क्या नहीं करना चाहिए, लेकिन एक साधारण डिज़ाइन जो उपयोग करना आसान नहीं है और विस्तार करता है, वह उन चीजों को करता है।सी ++ अपवाद कक्षा डिजाइन
- अपवाद कक्षाएं, के बाद से यह किसी भी मौका बिना प्रक्रिया की समाप्ति के लिए सीधे नेतृत्व त्रुटि आदि
- यह एक उपयोगकर्ता के अनुकूल स्ट्रिंग पाने के लिए संभव होने की जरूरत है प्रवेश करने के लिए कर सकता है, अपवाद फेंक नहीं करना चाहिए अपनी भाषा के लिए बेहतर स्थानीयकृत, ताकि अगर किसी त्रुटि से पुनर्प्राप्त नहीं हो पाता है तो एप्लिकेशन को स्वयं समाप्त होने से पहले कुछ कहने के लिए कुछ है।
- स्टैक को खोलने के रूप में जानकारी जोड़ने की आवश्यकता होनी चाहिए, उदाहरण के लिए यदि कोई एक्सएमएल पार्सर एक इनपुट स्ट्रीम को पार्स करने में विफल रहता है, तो यह जोड़ने में सक्षम होने के लिए कि स्रोत फ़ाइल से या नेटवर्क पर था,
- अपवाद हैंडलर को अपवाद को संभालने के लिए आवश्यक जानकारी तक आसानी से पहुंच की आवश्यकता है
- लॉग फ़ाइल में स्वरूपित अपवाद जानकारी लिखें (अंग्रेज़ी में, इसलिए यहां कोई अनुवाद नहीं है)।
एक साथ काम करने के लिए 1 और 4 प्राप्त करना मेरे पास सबसे बड़ा मुद्दा है, क्योंकि किसी भी स्वरूपण और फ़ाइल आउटपुट विधियां संभावित रूप से विफल हो सकती हैं।
संपादित करें: इसलिए कई कक्षाओं में अपवाद वर्गों को देखा गया है, और नील से जुड़े प्रश्न में भी, यह आइटम 1 (और इस प्रकार बूस्ट अनुशंसाओं) को पूरी तरह से अनदेखा करने के लिए सामान्य प्रथा प्रतीत होता है, जो प्रतीत होता है मेरे लिए एक बुरा विचार है।
वैसे भी मैंने सोचा कि आईडी भी अपवाद वर्ग पोस्ट कर रहा है जिसे मैं उपयोग करने के बारे में सोच रहा हूं। के बाद से सभी तार एक आंतरिक, तय आकार बफर को कॉपी करके नियंत्रित किया जाता है
class Exception : public std::exception
{
public:
//enum for each exception type, which can also be used to determin
//exception class, useful for logging or other localisation methods
//for generating a message of some sort.
enum ExceptionType
{
//shouldnt ever be thrown
UNKNOWN_EXCEPTION = 0,
//same as above but has a string that may provide some info
UNKNOWN_EXCEPTION_STR,
//eg file not found
FILE_OPEN_ERROR,
//lexical cast type error
TYPE_PARSE_ERROR,
//NOTE: in many cases functions only check and throw this in debug
INVALID_ARG,
//an error occured while trying to parse data from a file
FILE_PARSE_ERROR,
}
virtual ExceptionType getExceptionType()const throw()
{
return UNKNOWN_EXCEPTION;
}
virtual const char* what()throw(){return "UNKNOWN_EXCEPTION";}
};
class FileOpenError : public Exception
{
public:
enum Reason
{
FILE_NOT_FOUND,
LOCKED,
DOES_NOT_EXIST,
ACCESS_DENIED
};
FileOpenError(Reason reason, const char *file, const char *dir)throw();
Reason getReason()const throw();
const char* getFile()const throw();
const char* getDir()const throw();
private:
Reason reason;
static const unsigned FILE_LEN = 256;
static const unsigned DIR_LEN = 256;
char file[FILE_LEN], dir[DIR_LEN];
};
प्वाइंट 1 संबोधित किया जाता है (यदि आवश्यक छोटा है, लेकिन हमेशा समाप्त नल)।
हालांकि यह बिंदु 3 को संबोधित नहीं करता है, हालांकि मुझे लगता है कि वास्तविक दुनिया में वास्तविक बिंदु में सीमित उपयोग की संभावना है, और यदि आवश्यक हो तो एक नया अपवाद फेंकने की संभावना अधिक हो सकती है।
यह एक? http://stackoverflow.com/questions/1157591/c-exception-handing – GManNickG
वह वही था जिसे मैं सोच रहा था, हालांकि इसे फिर से पढ़ना, ऐसा लगता है कि यह थोड़ा अलग प्रश्नों का उत्तर देता है। –
विभिन्न कक्षाओं के साथ क्या गलत है? आप उन्हें अलग-अलग संभालना चाहते हैं, या यहां तक कि कुछ को संभालना और दूसरों को छोड़ना चाहते हैं। –