pthread_exit
एक ___forced_unwind अपवाद फेंक सकता है, कि धागा बाहर निकलने के दौरान स्टैक के लिए प्रयोग किया जाता है। यह std::exception
से प्राप्त नहीं होता है, और इसलिए इसे एक के रूप में नहीं पकड़ा जा सकता है।
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
कारण एक अपवाद फेंका जाता है कि pthread_exit
कभी नहीं निर्दिष्ट किया जाता है वापस जाने के लिए है: आपको लगता है कि अपवाद को पकड़ने करते हैं, throw
यह फिर से करने के लिए सुनिश्चित तो यह अपना काम कर सकते हैं हो सकता है। इसे स्टैक-आवंटित चर के सफाई की गारंटी देता है, और इसके स्थान के बाद कोड का निष्पादन नहीं होता है (जब तक कि आप अनचाहे अपवाद नहीं लेते ...)।
बीटीडब्ल्यू, यह एक और मामला है जहां catch (...)
मुहावरे अच्छा से ज्यादा नुकसान करता है। इसे कभी-कभी अज्ञात अपवादों को फेंकने वाले कोड को "स्थिर" करने के लिए उपयोग किया जाता है। लेकिन यह केवल बाद के समय और स्थान पर क्षति की दृश्यता को रोकता है, जिससे समस्या की वास्तविक उत्पत्ति को पहचानना असंभव हो जाता है। इस तरह के पकड़ में करने के लिए एकमात्र उचित बात न्यूनतम सफाई, संभवतः लॉगिंग, और फिर पुनर्स्थापना है। एक अनचाहे अपवाद के कारण क्रैश होने वाली एक प्रक्रिया एक सुंदर दृष्टि नहीं है, लेकिन यह एक डीबग करने योग्य क्रैश डंप प्रदान कर सकती है जो स्पष्ट रूप से दोषपूर्ण कमांड दिखाती है। लेकिन यह सिर्फ catch (...)
के खिलाफ मेरी चिल्लाहट है, जो pthread_exit
से मुश्किल से संबंधित है ...
आप इसे किस संकलक के अंतर्गत देख रहे हैं? –
@ फ़ैबियो शायद ढेर पर किसी ऑब्जेक्ट का कुछ विनाशक फेंक रहा है। –
@ डेव्स जी ++ टोरस्टेनरोबित्स्की धन्यवाद, मैं वही हूं, लेकिन मामला ईरान –