मैंने कई तरीकों से प्रयास किया है; यह मेरे लिए काम करता है:
उपवर्गीकरण द्वारा शुरू runtime_error:
/*----------------------------------------------------------------------*/
/* subclass runtime_error for safe exceptions in try/throw/catch */
#include <stdexcept>
/* a little preprocessor magic here -- makes a subclass of runtime_error*/
#define NEWERROR(NE) class NE : public runtime_error { \
public: NE (string const& error) : runtime_error(error) {} }
NEWERROR(FileError );
NEWERROR(NetworkError );
NEWERROR(StringError );
NEWERROR(CofeeError );
/*----------------------------------------------------------------------*/
तो फिर आप अपने अपवादों में से कुछ उदाहरणों बना सकते हैं।
/*----------------------------------------------------------------------*/
/* some example pre-defined exceptions */
FileError ReadOnly ("ReadOnly" );
FileError FileNotFound ("FileNotFound" );
NetworkError TimeOutExceeded ("TimeOutExceeded" );
NetworkError HostNotFound ("HostNotFound" );
CoffeeError OutOfCoffee ("OutOfCoffee" );
/*----------------------------------------------------------------------*/
स्पष्ट रूप से संकलक है कि आपके समारोह एक अपवाद या कार्यक्रम शायद बिंदु फेंक दिया पर समाप्त होगा फेंक सकता है सूचित करेंगे, और डेटा खो दिया है या भ्रष्ट अगर संसाधनों समय में उपयोग में हैं हो सकता है।
"सुनिश्चित करें कि आप कुछ भी पकड़ सकते हैं जो आप फेंक सकते हैं।"
(मैं सामान्य runtime_error उपयोग करें, क्योंकि फेंक और इसे पकड़ने मेरी अपवाद प्लस प्रणाली 'लोगों के सभी के साथ-साथ शामिल किया गया।)
/*----------------------------------------------------------------------*/
/* example function that may throw an exception */
#include <fstream>
ifstream& getFileStream (string fname) throw (runtime_error)
{
if (fname == "")
throw StringError("<getFileStream> fname:empty string");
// processing stops here if thrown
try
{
ifstream Inputfstream;
ifstream& ifsref = Inputfstream;
// ifstream has its own <legacy> exception
// mechanisms and procedures
ifsref.exceptions (ifstream::failbit | ifstream::badbit);
ifsref.open (fname , ifstream::in); // could fail ==> ifstream::failure exception
}
catch (ifstream::failure e)
{
throw FileError(fname + string(e.what()));
}
return ifsref;
}
/*----------------------------------------------------------------------*/
फिर अपने ट्राई/कैच में
/*----------------------------------------------------------------------*/
catch (FileNotFound fnf) //catch a specific error
{
if (DEBUG) cerr << "[File Not Found Error: " << fnf.what() << "]" << endl;
... (handle it) ...
}
catch (FileError fe) //catch a specific type
{
if (DEBUG) cerr << "[File Error: " << fe.what() << "]" << endl;
... (handle it) ...
}
catch (runtime_error re) // catch a generic type
{
if (DEBUG) cerr << "[Runtime error: " << re.what() << "]" << endl;
// determine type by string comparison
if (re.what() == string("ResourceNotavailable")) ...
if (re.what() == string("NetWorkError") ) ...
...
}
catch (...) // catch everything else
{ ... exit, rethrow, or ignore ... }
/*----------------------------------------------------------------------*/
रनटाइम-त्रुटि कक्षा सी ++ मानक पुस्तकालयों, में अच्छा समर्थन है और संकलक जानते हैं इसके बारे में आंतरिक रूप से, और मेमोरी और प्रेषण को अनुकूलित करने के लिए, ताकि आप उन्हें विभिन्न कोड अड्डों पर सुरक्षित और आत्मविश्वास से उपयोग कर सकें। कोड पोर्टेबल और कई अलग-अलग कंपाइलरों और आर्किटेक्चर के साथ संगत है।
यह अधिक विशिष्ट और अधिक सामान्य से अलग त्रुटि से प्रत्येक त्रुटि को पकड़ने के लिए बेहतर और कुछ तेज़ हो सकता है, यदि आपको लगता है कि स्ट्रिंग मैचों की श्रृंखला सीपीयू और मेमोरी का एक भयानक अपशिष्ट है (संकलक इन्हें अनुकूलित करता है)।
उपयोग वाक्य रचना
<stdexcept>
2 समूहों में आप अपवाद के कई प्रकार देता है उनमें से कुछ के लिए थोड़ा अलग है। C++
परम्परागत ज्ञान का कहना है कि अपने अपवाद अपेक्षाकृत "फ्लैट" होना चाहिए, अर्थ अपवाद की विशिष्ट श्रेणियों की बड़ी पदानुक्रम सामान्य प्रोग्रामिंग कार्यों के लिए कम सामान्य लेकिन जानकारीपूर्ण लोगों की पक्ष में परहेज किया जाना चाहिए। डोमेन सिस्टम लॉजिक, उच्च गणित इत्यादि जैसे डोमेन विशिष्ट कार्य विशिष्टता से लाभ उठा सकते हैं, लेकिन जेनेरिक रनटाइम/तर्क अपवादों के साथ बुद्धिमान त्रुटि तार बनाकर इसे आसानी से हासिल किया जा सकता है।
अन्त में, मेरे प्वाइंट है: आप फेंकने से इस सब को प्राप्त करने और केवल पकड़ने runtime_error कर सकते हैं।
आपको प्रत्येक वर्ग के लिए अत्यधिक विशिष्ट अपवाद (जावा की तरह) का पूरा चाल-बैग बनाना नहीं है, प्रत्येक एक विशिष्ट त्रुटि को संभालने वाला है।
क्या आप समझ सकते हैं कि आपको इसकी आवश्यकता क्यों है? शायद हम विकल्पों के लिए देख सकते हैं? –
मैं स्पष्ट रूप से स्क्रैच से कुछ कोडिंग नहीं करता हूं, लेकिन विशिष्ट परिस्थितियों में मैं इसके तहत उपयोगी हूं। लीगेसी कोड। –