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