2016-03-31 6 views
11

उद्देश्य-सी में, NSSetUncaughtExceptionHandler अपवाद के बारे में कुछ अंतिम मिनट लॉगिंग करने के लिए कुछ कार्यक्षमता पंजीकृत कर सकता है।स्विफ्ट क्रैश को कैसे पकड़ें और कुछ लॉगिंग करें

यह स्विफ्ट से कुछ दुर्घटनाग्रस्त नहीं होता है।

स्विफ्ट में वैश्विक स्तर पर ऐसा कुछ करना संभव है? जैसे अगर स्विफ्ट कोड में कोई दुर्घटना होती है, तो कुछ लॉगिंग करें, जैसे कि एक वैकल्पिक विकल्प को अनचाहे करना।

विशेष रूप से, मैं ऐप में नेटवर्क यातायात लॉग करने के लिए उपयोगिता कर रहा हूं, और यदि कोई दुर्घटना होती है तो मैं अपने इन-मेमोरी डेटा डिस्क पर फ्लश करना चाहता हूं।

+0

मुझे लगता है कि शायद ऐप्पल ने इसके लिए रिएक्टर की तरह काम नहीं किया था। – Lumialxk

उत्तर

1

अपने प्रश्नों के कई पहलुओं रहे हैं, मुझे उन्हें जवाब देने की कोशिश करते हैं:

  1. NSSetUncaughtExceptionHandler केवल ध्यान में न आया अपवाद जो तभी संभव दुर्घटनाओं के एक छोटे सबसेट है फैल जाती है। ऑब्जेक्टिव-सी में
  2. अपवाद घातक हो परिभाषित कर रहे हैं और यह उन्हें पकड़ने और किसी भी गैर async सुरक्षित कोड है, जो किसी भी ऑब्जेक्टिव-सी और स्विफ्ट कोड भी शामिल है और भी अधिक नहीं की सिफारिश को चलाने के लिए करने के लिए अनुशंसित नहीं है
  3. दुर्घटनाओं को पकड़ने के लिए आपको सिग्नल हैंडलर सेट अप करने की आवश्यकता है और फिर क्रैश के समय केवल एसिंक-सुरक्षित कोड चलाएं, जो सी का केवल एक छोटा सबसेट है। विशेष रूप से आप क्रैश समय पर नई मेमोरी आवंटित नहीं कर सकते हैं।
  4. कृपया याद रखें, जब आपका ऐप दुर्घटनाग्रस्त हो जाता है तो यह अत्यधिक अस्थिर कोड में होता है और ऑब्जेक्ट या वेरिएबल संदर्भ कुछ अप्रत्याशित रूप से इंगित कर सकते हैं। तो आपको वास्तव में क्रैश समय पर कुछ भी नहीं करना चाहिए।
  5. क्रैश के साथ काम करने का सबसे अच्छा खुला स्रोत तरीका PLCrashReporter का उपयोग कर रहा है, जो क्रैश समय पर कोड को आमंत्रित करने के लिए विधि भी प्रदान करता है। लेकिन फिर, यह async- सुरक्षित होना चाहिए।

अपने विशिष्ट परिदृश्य में: आपको ऐसा नहीं करना चाहिए और कोशिश नहीं करना चाहिए। इससे उपयोगकर्ता डेटा दूषित हो सकता है या अधिक डेटा खो जा सकता है। ऐप ने गंभीर मुद्दों के साथ कड़ी मेहनत की, बल्कि इस मुद्दे को ठीक किया।

-1
NSSetUncaughtExceptionHandler(&HandleException); 
signal(SIGABRT, SignalHandler); 
signal(SIGILL, SignalHandler); 
signal(SIGSEGV, SignalHandler); 
signal(SIGFPE, SignalHandler); 
signal(SIGBUS, SignalHandler); 
signal(SIGPIPE, SignalHandler); 

यह ज्यादातर स्थितियों के लिए काम करेगा। लेकिन मैं सभी दुर्घटनाओं को पकड़ने के लिए कुछ रास्ता खोजने की भी कोशिश कर रहा हूं। खैर, यदि आप दस्तावेजों को देखने के लिए उन संकेतों पर क्लिक करते हैं, तो आप पाएंगे कि 20 से अधिक प्रकार के सिग्नल हैं, मैंने जो किया है वह संकेत है (,) सभी प्रकार के सिग्नल। ऐसा लगता है कि काम करता है, लेकिन शायद कुछ दुर्घटना इकट्ठा नहीं हो सकती है।

5

NSSetUncaughtExceptionHandler केवल NSExceptions के साथ काम करता है। शानदार स्पष्टीकरण के लिए this SO उत्तर देखें।

स्विफ्ट रन टाइम त्रुटियों को पकड़ने के लिए SIGTRAP के लिए सिग्नल हैंडलर लागू करें। जहाँ तक मुझे पता है, स्विफ्ट कोड SIGTRAP अपवाद प्रकार के साथ कार्यक्रम समाप्त कर देगा यदि यह क्रम यानी पर एक अनपेक्षित स्थिति केवल SIGTRAP तरह SIGSEGV, SIGBUS, SIGILL काम नहीं करते स्विफ्ट त्रुटियों, बाकी को पकड़ने के लिए उपयोगी है का पता लगाता है। मुझे यह जानकारी this apple लिंक में मिली।

यदि आपका कोड उद्देश्य-सी और स्विफ्ट दोनों मिश्रण है, तो NSSetUncaughtExceptionHandler दोनों को लागू करें और क्रैश को संभालने के लिए हैंडलर सिग्नल करें।

सिग्नल हैंडलिंग को समझने और कार्यान्वित करने के लिए this लिंक देखें।

उम्मीद है कि इससे मदद मिलती है।

+2

मैंने अधिकांश सिग्नल ('सिगट्रैप 'शामिल) के लिए एक सिग्नल हैंडलर जोड़ा, हालांकि यह" घातक त्रुटि को संभाल नहीं करता है: वैकल्पिक मूल्य को अनदेखा करते समय अनपेक्षित रूप से पाया गया शून्य "। मैंने 'NSSetUncaughtExceptionHandler()' के साथ एक अपवाद हैंडलर भी जोड़ा ... –

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