2015-06-16 25 views
7

कैच हैंडलर नहीं चलाया जाता है। पर क्यों?यह कोड ब्लॉक को निष्पादित क्यों नहीं करता है?

यदि try ब्लॉक से पहले शुरू किया गया है, तो कैच हैंडलर चलता है।

यदि कैच ब्लॉक का प्रकार फेंकने वाले प्रकार से मेल नहीं खाता है, तो प्रोग्राम यह बताता है कि थ्रेड को बिना किसी अपवाद के समाप्त कर दिया गया है, यह बताते हुए कि अपवाद को संभाला जाता है, फिर भी कैच ब्लॉक नहीं चलाया जाता है।

#include <iostream> 
#include <thread> 

using namespace std; 

void do_work() {} 

int main() { 
    std::cerr << "RUNNING" << std::endl; 
    try { 
    thread t(do_work); 
    std::cerr << "THROWING" << std::endl; 
    throw logic_error("something went wrong"); 
    } catch (logic_error e) { 
    std::cerr << "GOTCHA" << std::endl; 
    } 

    return 0; 
} 

संकलित आदेश:

try { 
    thread t(do_work); 
    t.join();         // <<< add this 
    std::cerr << "THROWING" << std::endl; 
    throw logic_error("something went wrong"); 
} catch (logic_error e) { 
    std::cerr << "GOTCHA" << std::endl; 
} 

एक joinable thread that goes out of scope, causes terminate to be called:

c++ -std=c++14 -pthread -pedantic -Wall -Wextra -O0 scratch.cpp -o scratch 
+2

सबमिट बटन को मारने से पहले कृपया अपना कोड इंडेंट करें – bhavesh

+0

पृथ्वी पर इसका डाउनवोट क्यों है? \ * स्क्रैच हेड \ * –

+0

@ लाइटनेसरेसेसिन ऑर्बिट किसी ने कोड को तोड़ने के बाद शायद वापस डाउनवॉट किया था। – user2079303

उत्तर

5

आप धागा शामिल होने के लिए भूल गया था। इसलिए, आपको दायरे से बाहर होने से पहले join या detach पर कॉल करने की आवश्यकता है।

2

में सी ++ 11, 30.3.1.3, धागा नाशक मानक कहते हैं

तो joinable() तो समाप्त(), अन्यथा कोई ई एफएफ ECTS। [नोट: या तो इसके विनाशक में शामिल होने योग्य() थ्रेड को पूरी तरह से अलग करने या शामिल करने के परिणामस्वरूप डी एफएफआई पंथ में अपवाद (डिटेच के लिए) या प्रदर्शन (शामिल होने के लिए) डिबग करने के लिए केवल अपवाद उठाए जाने पर बग का सामना करना पड़ सकता है। इस प्रकार प्रोग्रामर को यह सुनिश्चित करना चाहिए कि थ्रेड अभी भी शामिल होने पर विनाशक को कभी निष्पादित नहीं किया जाता है। अंत टिप्पणी]

इस प्रकार अपने कार्यक्रम terminate रों एक बार धागा नाशक क्योंकि गुंजाइश समाप्त हो जाती है और catch तर्क निष्पादित कभी नहीं किया गया है कहा जाता है।

आप अपने कार्यक्रम धागा के क्षेत्र से बाहर अपवाद को पकड़ने लेकिन फेंक जबकि धागा अभी भी joinable है करना चाहते हैं, तो आप धागा ही है, join या detach धागा और rethrow के दायरे में उसे पकड़ने की आवश्यकता होगी जो कुछ भी पकड़ लिया गया है

try 
{ 
    std::thread t(foo); 
    try 
    { 
    std::cerr << "THROWING" << std::endl; 
    throw std::logic_error("something went wrong"); 
    } 
    catch (...) // catch everything 
    { 
    t.join(); // join thread 
    throw; // rethrow 
    } 
    t.join(); 
} 
catch (std::logic_error & e) 
{ 
    std::cerr << "GOTCHA: " << e.what() << std::endl; 
} 
संबंधित मुद्दे