2012-04-26 30 views
7

जानबूझ कर मैं इस विधि है जो एक फ़ाइल में लिखते आ रही है, तो मैं possiblity है कि मैं एक बंद फाइल में लिख रहा हूँ के अपवाद को संभालने की कोशिश की:ofstream अपवाद हैंडलिंग

void printMe(ofstream& file) 
{ 
     try 
     { 
      file << "\t"+m_Type+"\t"+m_Id";"+"\n"; 
     } 
     catch (std::exception &e) 
     { 
      cout << "exception !! " << endl ; 
     } 
}; 

लेकिन जाहिरा तौर पर एसटीडी: : अपवाद एक बंद फ़ाइल त्रुटि के लिए उपयुक्त अपवाद नहीं है क्योंकि मैंने जानबूझकर पहले से बंद फ़ाइल पर इस विधि का उपयोग करने की कोशिश की लेकिन मेरी "अपवाद !!" टिप्पणी उत्पन्न नहीं हुई थी।

तो मुझे क्या अपवाद लिखा जाना चाहिए ??

उत्तर

12

स्ट्रीम डिफ़ॉल्ट रूप से अपवाद नहीं फेंकते हैं, लेकिन आप उन्हें फंक्शन कॉल file.exceptions(~goodbit) के साथ अपवाद फेंकने के लिए कह सकते हैं।

इसके बजाय, त्रुटियों का पता लगाने के सामान्य तरीके से बस स्ट्रीम का राज्य जाँच करने के लिए है:

if (!file) 
    cout << "error!! " << endl ; 

इस का कारण यह है कि वहाँ कई आम स्थितियों में, जहां गलत पढ़ा एक छोटी समस्या, नहीं एक प्रमुख है कर रहे हैं एक:

while(std::cin >> input) { 
    std::cout << input << '\n'; 
} //read until there's no more input, or an invalid input is found 
// when the read fails, that's usually not an error, we simply continue 

तुलना करने के लिए:

for(;;) { 
    try { 
     std::cin >> input; 
     std::cout << input << '\n'; 
    } catch(...) { 
     break; 
    } 
} 

यह लाइव देखें: +०१२३८३०९७४१ प्रकार ios_base::failure की

+0

अच्छी तरह से मुझे अपवाद हैंडलिंग में उपयोग करने की कोशिश की गई थी, लेकिन यह जानना अच्छा है कि "स्ट्रीम डिफ़ॉल्ट रूप से अपवाद नहीं फेंकते हैं", बहुत बहुत धन्यवाद – Glolita

4

अपवाद, हालांकि ध्यान दें कि आप ios::exceptions साथ उचित झंडा अपवाद वरना केवल आंतरिक स्थिति झंडे त्रुटि है, जो डिफ़ॉल्ट व्यवहार है यह दर्शाता है के लिए स्थापित किया जाएगा उत्पन्न करने के लिए निर्धारित किया है चाहिए कि धाराओं के लिए।

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