2010-09-10 10 views
6

मैं एक साधारण कस्टम runtime_error करने की कोशिश कर रहा हूँ। मैं वर्ग को परिभाषित:अपनी खुद की कस्टम रनटाइम त्रुटि वर्ग कैसे करें?

#include <string> 
#include <stdexcept> 


namespace utils{ 

class FileNotFoundException: public std::runtime_error{ 
    public: 
    FileNotFoundException():runtime_error("File not found"){} 
    FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 
}; 

}; 

तो मैं त्रुटि फेंक:

bool checkFileExistence(std::string fileName) 
{ 
    boost::filesystem::path full_path = boost::filesystem::system_complete(boost::filesystem::path(fileName)); 
    if (!boost::filesystem::exists(full_path)) 
    { 
    char msg[500]; 
    _snprintf(msg,500,"File %s doesn't exist",fileName.c_str()); 
    throw new FileNotFoundException(msg); 
    } 
} 

और मैं एक आज़माएं/कैच ब्लॉक का उपयोग

try{ 
      checkFileExistence(fileName); 
    } 
    catch(utils::FileNotFoundException& fnfe) 
     { 
      std::cout << fnfe.what() << std::endl; 
    } 

रनटाइम त्रुटि को सही ढंग से FileNotFoundException लेकिन रेखा के रूप में फेंक दिया जाता है std :: cout के साथ कभी नहीं पहुंचा है और कंसोल पर कोई पंक्ति writed है।

सभी विचारों का स्वागत है। धन्यवाद!

+0

आप अपने अपवाद वर्ग में ओवरराइड करने के बजाय डिफ़ॉल्ट तर्क का उपयोग करना चाह सकते हैं। –

उत्तर

13

ऐसा इसलिए है क्योंकि आप एक सूचक फेंक रहे हैं। बस करें: throw FileNotFoundException(msg);

जब भी आप एक सूचक का उपयोग करते हैं, जब तक कि आप इसे एक कंटेनर/रैपर में नहीं डाल रहे हैं, तो आप शायद सही काम नहीं कर रहे हैं।

5

आप throw new FileNotFoundException(msg) लिखते हैं, तो इसे 'FileNotFoundException (msg)' फेंकना चाहिए। नियम मूल्य से फेंक दिया जाता है, संदर्भ द्वारा पकड़ो।

+1

जब तक आप माइक्रोसॉफ्ट के साथ एमएफसी नहीं हैं, तो नियम पॉइंटर द्वारा फेंक दिया जाता है और पॉइंटर द्वारा पकड़ लिया जाता है। उन्होंने अपने अपवाद वर्गों को मानक फेंक/पकड़ के लिए पूर्ण समर्थन देने से पहले बनाया, जिसके परिणामस्वरूप कुछ दिलचस्प समझौता हुआ। –

3

आप वास्तव में एक ढेर आवंटित ऑब्जेक्ट (FileNotFoundException *) में पॉइंटर फेंक रहे हैं ताकि प्रकार मेल नहीं खाते। आम तौर पर, संदर्भ द्वारा मूल्य और पकड़ द्वारा फेंक दें (rule 73)।

1

बीटीडब्ल्यू, निम्नलिखित घोषणा के साथ आप संदेश स्ट्रिंग की एक प्रति बनाते हैं।

FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 

लिखें "स्थिरांक std :: स्ट्रिंग & संदेश" के बजाय। यह सिर्फ एक ढेर पर एक संदर्भ डाल देगा। जबकि अब आप पूरी स्ट्रिंग को ढेर पर डाल देते हैं।

+0

सुधारित! विचार के लिए धन्यवाद! – Killrazor

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