कुछ सी ++ पुस्तकालय त्रुटि के मामले में abort() फ़ंक्शन को कॉल करते हैं (उदाहरण के लिए, एसडीएल)। इस मामले में कोई सहायक डीबग जानकारी प्रदान नहीं की जाती है। निरस्त कॉल पकड़ना और कुछ डायग्नोस्टिक लॉग आउटपुट लिखना संभव नहीं है। मैं इन पुस्तकालयों को पुनर्लेखन/पुनर्निर्माण के बिना वैश्विक स्तर पर इस व्यवहार को ओवरराइड करना चाहता हूं। मैं अपवाद फेंकना और इसे संभालना चाहता हूं। क्या यह संभव है?सी ++ निरस्त ओवरराइड
उत्तर
ध्यान दें कि abort
SIGABRT
सिग्नल बढ़ाता है, जैसे कि इसे raise(SIGABRT)
कहा जाता है। तुम बहुत की तरह, एक संकेत हैंडलर इस स्थिति में कहा जाता हो जाता है कि स्थापित कर सकते हैं:
#include <signal.h>
extern "C" void my_function_to_handle_aborts(int signal_number)
{
/*Your code goes here. You can output debugging info.
If you return from this function, and it was called
because abort() was called, your program will exit or crash anyway
(with a dialog box on Windows).
*/
}
/*Do this early in your program's initialization */
signal(SIGABRT, &my_function_to_handle_aborts);
आप (कीड़े कि अपने सबसे अच्छे इरादों के बावजूद में रेंगना की वजह से कहते हैं, वे कर रहे हैं) abort
कॉल्स को रोकने नहीं कर सकते, यह आपको कुछ और डीबगिंग जानकारी एकत्र करने की अनुमति दे सकता है। यह पोर्टेबल एएनएसआई सी है, इसलिए यह यूनिक्स और विंडोज़ और अन्य प्लेटफ़ॉर्म पर भी काम करता है, हालांकि आप निरंतर हैंडलर में जो भी करते हैं वह प्रायः पोर्टेबल नहीं होगा। ध्यान दें कि इस हैंडलर को भी कहा जाता है जब assert
विफल रहता है, या यहां तक कि अन्य रनटाइम फ़ंक्शंस द्वारा - कहें, अगर malloc
ढेर भ्रष्टाचार का पता लगाता है। तो आपका प्रोग्राम उस हैंडलर के दौरान पागल स्थिति में हो सकता है। आपको स्मृति आवंटित नहीं करना चाहिए - यदि संभव हो तो स्थैतिक बफर का उपयोग करें। आपको आवश्यक जानकारी एकत्र करने के लिए बस न्यूनतम करें, उपयोगकर्ता को एक त्रुटि संदेश प्राप्त करें, और छोड़ दें।
कुछ प्लेटफ़ॉर्म उनके abort
कार्यों को और अनुकूलित करने की अनुमति दे सकते हैं। उदाहरण के लिए, विंडोज़ पर, विज़ुअल सी ++ में एक फ़ंक्शन _set_abort_behavior
है जो आपको यह चुनने देता है कि उपयोगकर्ता को संदेश प्रदर्शित किया गया है या नहीं, और क्रैश डंप एकत्र किए जाते हैं या नहीं।
आप अपना खुद का लिखने का प्रयास कर सकते हैं और लिंकर को std :: abort के स्थान पर कॉल करने के लिए प्राप्त कर सकते हैं। मुझे यकीन नहीं है कि यह संभव है हालांकि।
लिनक्स पर मैन पेज के अनुसार, abort() एक सिग्नल हैंडलर द्वारा पकड़ा जा सकता है कि प्रक्रिया के लिए एक SIGABRT उत्पन्न करता है। संपादित करें: बेन ने पुष्टि की है कि यह विंडोज़ पर भी संभव है - नीचे अपनी टिप्पणी देखें।
विजुअल सी ++ का निरस्त समारोह भी करता है। शून्य abort() - SIGABRT उठाकर वर्तमान कार्यक्रम को निरस्त करें उद्देश्य: एक निरस्त संदेश मुद्रित करें और SIGABRT सिग्नल बढ़ाएं। यदि उपयोगकर्ता ने एक निरंतर हैंडलर रूटीन परिभाषित नहीं किया है, तो सफाई के बिना 3 की निकास स्थिति के साथ कार्यक्रम को समाप्त करें।
–
- 1. सी ++ ओवरराइड/अधिभार समस्या
- 2. सी ++ आभासी विधि ओवरराइड
- 3. पृष्ठभूमि कार्यकर्ता निरस्त
- 4. गिट पुल निरस्त करना
- 5. रेक निरस्त! ऑक्टोप्रेस
- 6. रेक निरस्त! त्रुटि: डेटाबेस
- 7. सी # वर्चुअल और ओवरराइड कीवर्ड
- 8. सी ++ धाराओं को ओवरराइड करें
- 9. उद्देश्य-सी: डायनामिक गेटर ओवरराइड
- 10. रेक निरस्त! अप्रारंभीकृत निरंतर Mysql2
- 11. दबाएं "BEGIN विफल - संकलन निरस्त"
- 12. ओवरराइड विधियों के लिए उद्देश्य-सी सम्मेलन
- 13. सी # वर्चुअल और ओवरराइड के आंतरिक कार्य
- 14. कस्टम ऑब्जेक्ट्स के लिए उद्देश्य सी ओवरराइड% @
- 15. ओवरराइड और गैर ओवरराइड निर्माता
- 16. एआरएम अपवादों में प्रीफेच निरस्त करने और डेटा निरस्त करने के वापसी पते क्यों अलग हैं?
- 17. लुआ में सी ++ विधि को ओवरराइड करना और इसे सी ++
- 18. "रेक निरस्त! स्टैक स्तर बहुत गहरा" हैरोकू
- 19. निरस्त() और समाप्त() "लाइव" कहां है?
- 20. सॉकेट कनेक्शन निरस्त किया गया था - CommunicationException
- 21. सीएसआरएफ सत्यापन विफल रहा। अनुरोध निरस्त django
- 22. System.out.print() के आउटपुट को ओवरराइड (ओओपी ओवरराइड नहीं) कैसे करें?
- 23. आभासी, ओवरराइड, नए और सील ओवरराइड
- 24. log4j.properties ओवरराइड
- 25. ओवरराइड __setattr__
- 26. विशेषताएँ ओवरराइड
- 27. ! महत्वपूर्ण ओवरराइड
- 28. हाइबरनेट ओवरराइड
- 29. अंतर ओवरराइड
- 30. ओवरराइड अजगर
क्या होगा यदि my_function_to_handle_aborts फेंकता है?) –
@ पावेल: यह कार्यान्वयन-परिभाषित है, यानी पोर्टेबल नहीं है। असल में, आपको सी की विशेषताओं का उपयोग करने में सक्षम होने की गारंटी दी जाती है, लेकिन हो सकता है कि आप C++ सुविधाओं का उपयोग करने में सक्षम न हों जैसे वैरिएबल घोषित करना, 'नया', 'हटाएं', या अपवाद फेंकना। कई कार्यान्वयन में, हालांकि यह काम कर सकता है। साथ ही, समारोह में सी लिंकेज होना चाहिए - मैंने जवाब संपादित किया है, लेकिन विंडोज या यूनिक्स पर कोई फर्क नहीं पड़ता है। – Doug
विस्तृत उत्तर के लिए धन्यवाद। –