2011-12-06 12 views
24

मैंने देखा है किमें सी ++ 11 में कुछ और दिलचस्प घोषणाएं हैं। क्या कोई भी इसका मतलब क्या कर सकता है और उनका उपयोग कैसे कर सकता है?क्या :: std :: nested_exception और दोस्तों के कोई अच्छे विवरण हैं?

लोगों मैं के बारे में सोच रहा हूँ

हैं:

  1. ::std::nested_exception
  2. ::std::throw_with_nested
  3. ::std::rethrow_if_nested

साथ ही, जब वे स्वतः स्पष्ट लगता है, यह पता करने के लिए कितना अच्छा हो सकता है ये काम किया:

  1. ::std::exception_ptr
  2. ::std::make_exception_ptr
  3. ::std::current_exception
  4. ::std::rethrow_exception
+1

मानक में एक अच्छा (सर्वोत्तम?) विवरण उपलब्ध है। आप अंतिम [सार्वजनिक रूप से उपलब्ध ड्राफ्ट] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) को मुफ्त में पढ़ सकते हैं। – ybungalobill

उत्तर

22

कुछ उच्च स्तर कोड सामान्य रूप से सिर्फ std::exception पकड़ने और what() प्रिंट होगा। आप इस जेनेरिक तंत्र के लिए यथासंभव अधिक से अधिक जानकारी निचोड़ना चाहते हैं, फिर भी किसी भी जानकारी को खोए बिना।

archive::archive(const char* filename) 
{ 
    ifstream file(filename) 
    file.exceptions(ios_base::badbit); 
    open_archive(file); // throws ios_base::failure, or some other low-level exception. 
} 

जानकारी संग्रह करने के लिए उपलब्ध दर्ज नहीं है (उदाहरण के लिए फ़ाइल का नाम): कुछ संग्रह पुस्तकालय के एक कार्यान्वयन पर विचार करें। इसके अलावा आप अन्य अपवादों से संग्रह वर्ग से आए अपवादों को अलग करना चाहते हैं।

archive::archive(const char* filename) 
{ 
    try { 
     ifstream file(filename) 
     file.exceptions(ios_base::badbit); 
     open_archive(file); // throws ios_base::failure, or some other low-level exception. 
    } catch(const std::exception& e) { 
     throw archive_exception("Can't open archive", filename, e.what()); 
    } 
} 

अब हम उच्च स्तर के अर्थ जानकारी कहा कि archive वर्ग जानता है, लेकिन हम भी इस समस्या का मूल कारण (e के प्रकार) के बारे में जानकारी खो दिया है। nested_exception इस समस्या को हल करने के लिए है:

archive::archive(const char* filename) 
{ 
    try { 
     ifstream file(filename) 
     file.exceptions(ios_base::badbit); 
     open_archive(file); // throws ios_base::failure, or some other low-level exception. 
    } catch(...) { 
     throw_with_nested(archive_exception("Can't open archive", filename)); 
    } 
} 

सभी उपलब्ध जानकारी दर्ज की गई है। अब हम सामान्य रूप से पकड़ साइट में इसे पुनः प्राप्त कर सकते हैं:

void print_exception_info(const std::exception& e) 
{ 
    cerr << e.what() << "\n"; 
    try { 
     rethrow_if_nested(e); 
    } catch(const std::exception& ne) { 
     print_exception_info(ne); 
    } catch(...) { } 
} 

int main() { 
    try { 
     run(); 
    } catch(const std::exception& e) { 
     print_exception_info(e); 
    } 
} 

उत्पादन पहले की तुलना में अधिक वर्णनात्मक हो जाएगा।

खुला संग्रह "my_archive.bin"

पहुंच अस्वीकृत कर दी नहीं किया जा सकता: यह समस्या उच्चस्तरीय से निम्न स्तर के शुरू का वर्णन करेंगे।

या शायद:

नहीं खोल सकता संग्रह "my_archive.bin"

रिकार्ड 'aabb' नहीं मिला।

exception_ptr के साथ काम कार्यों बाद में उपयोग के लिए, धागे के बीच अपवाद हस्तांतरण करने के लिए, या अधिक आम तौर पर की दुकान एक अपवाद डिजाइन किए हैं। वे कैसे काम करते हैं कार्यान्वयन पर निर्भर करता है। इरादा यह था कि exception_ptr अपवाद वस्तु के लिए एक साझा सूचक होगा। हालांकि जब यह सूचक बनाया जाता है, अपवाद फेंकते समय या exception_ptr प्राप्त करने का प्रयास करते समय, कार्यान्वयन के अधीन होता है। जब आप current_exception() पर कॉल करते हैं तो कार्यान्वयन अभी भी अपवाद की प्रतिलिपि बनाने के लिए स्वतंत्र है।

+1

'print_exception_info'' try {std :: rethrow_if_nested() जैसी कुछ चीज़ों के रूप में बेहतर नहीं दिखेंगे; } पकड़ो ... '? – Cubbi

+0

जब मैं ऐसा करना चाहता हूं तो मैं आमतौर पर अपने उच्च स्तरीय अपवादों में निम्न स्तर के अपवाद को भरने के लिए स्थानों को आरक्षित कर रहा हूं। लेकिन मैं देख सकता हूं कि यह सामान्य तंत्र बेहतर कैसे है क्योंकि आपके पास एक बहुत ही सामान्य हैंडलर हो सकता है जो इसे सभी को अनचाहे करता है। – Omnifarious

+0

मैंने [cppreference.com] (http://en.cppreference.com/w/cpp/error/exception/nested_exception) के लिए अपना अधिकांश उदाहरण उधार लिया - यदि आप इसे हटाना या सुधारना चाहते हैं तो उस विकी को संपादित करने के लिए स्वतंत्र महसूस करें। – Cubbi

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