2013-08-07 7 views
7

मैं वास्तव में एसटीडी की तरह :: C++ 11 throw_with_nested के बाद से यह जावा के printStackTrace (emulates नेस्ट पकड़) लेकिन अभी मैं उदाहरण के लिए कितना एक नेस्टेड अपवाद को पकड़ने के लिए उत्सुक हूँ,:उपयोग throw_with_nested और अपवाद

void f() { 
    try { 
     throw SomeException(); 
    } catch(...) { 
     std::throw_with_nested(std::runtime_error("Inside f()")); 
    } 
} 
void g() { 
    try { 
     f(); 
    } catch(SomeException & e) { // I want to catch SomeException here, not std::runtime_error, :(
     // do something 
    } 
} 

पहले, मैंने सोचा था कि std :: throw_with_nested एक नया अपवाद उत्पन्न करता है जो दो अपवादों (std :: runtime_error और someException) से गुणा किया जाता है लेकिन कुछ ऑनलाइन ट्यूटोरियल पढ़ने के बाद, यह std :: upgrade_ptr के भीतर कुछ अपवाद को समाहित करता है और यह संभावना है कि मैं क्यों नहीं कर सकता पकड़ लो।

तब मुझे एहसास हुआ कि मैं std :: rethrow_if_nested (e) का उपयोग करके इसे ठीक कर सकता हूं लेकिन उपर्युक्त मामला केवल दो स्तर है जो संभालना आसान है लेकिन 10 सामान्य स्तर की तरह सामान्य स्थिति के बारे में सोच रहा हूं और मैं बस नहीं चाहता इसे संभालने के लिए std :: rethrow_if_nested 10 बार लिखने के लिए।

किसी भी सुझाव की वास्तव में सराहना की जाएगी।

+0

कुछ बार दोहराने के बजाय, एक लूप या एक पुनरावर्ती कार्य लिखें। –

+1

अपवाद को 'std :: runtime_error' और 'std :: nested_exception' से व्युत्पन्न किया गया है, लेकिन' कुछ अपवाद 'नहीं है। –

उत्तर

5

एक std::nested_exception unwrapping आसानी से प्रत्यावर्तन के माध्यम से पूरा किया है:

try { 
    throws(); 
} catch(const std::exception& e) { 
    try { 
     rethrow_unwrapped(e); 
    } catch (const SomeException& e) { 
     // do something 
    } 
} 

कार्रवाई में इस का एक डेमो here पाया जा सकता है:

template<typename E> 
void rethrow_unwrapped(const E& e) 
{ 
    try { 
     std::rethrow_if_nested(e); 
    } catch(const std::nested_exception& e) { 
     rethrow_unwrapped(e); 
    } catch(...) { 
     throw; 
    } 
} 

उपयोग कहाँ कुछ इस तरह दिखेगा।

+0

क्या आपका 'ई' पहले चरण में छाया/छायांकन है? – NicholasM

+0

हां, नेस्टेड कैच ब्लॉक के भीतर, 'ई' छायांकित है। – tclamb

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