बेस्ट प्रैक्टिस - NSError डोमेन और अपने खुद के प्रोजेक्ट / ऐप के लिए कोड


114

आपके अपने फ्रेमवर्क के लिए त्रुटि डोमेन सेट करने के बारे में एक पिछला SO पोस्ट है , लेकिन अपने स्वयं के प्रोजेक्ट / ऐप के लिए त्रुटि डोमेन और कस्टम त्रुटि कोड सेट करने के बारे में सबसे अच्छा अभ्यास क्या है ?

उदाहरण के लिए, आप सत्यापन के बहुत सारे के साथ एक कोर डेटा-गहन एप्लिकेशन पर हैं काम कर मान, तुम बस (जैसे कि "शेल्फ से" कोर डाटा त्रुटि कोड के साथ छड़ी चाहिए NSManagedObjectValidationErrorसे CoreDataErrors.h) या आप अपने स्वयं बनाना चाहिए MyAppErrors.hऔर साथ त्रुटियों को परिभाषित अधिक विशिष्टता (यानी MyAppValidationErrorInvalidCombinationOfLimbs,?

एक कस्टम त्रुटि डोमेन बनाना और त्रुटि कोड का सेट आपके कोड को महत्वपूर्ण रूप से अस्वीकृत कर सकता है, लेकिन क्या इसे बनाए रखने के लिए बहुत अधिक ओवरहेड है और क्या किसी को त्रुटि कोड नंबर संघर्ष के बारे में चिंता करना है? या अन्य चिंताएँ यहाँ हैं?

जवाबों:


152

मैं व्यक्तिगत रूप से रिवर्स-डीएनएस स्टाइल डोमेन का उपयोग करता हूं। उदाहरण के लिए:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

डोमेन के तीसरे भाग ( @"myproject") का उपयोग केवल इस परियोजना से त्रुटियों को अलग करने के लिए किया जाता है ( "My Project") किसी अन्य परियोजना में त्रुटियों ( "My Other Project"=> com.davedelong.myotherproject) से।

यह सुनिश्चित करने का एक सरल तरीका है कि मैं किसी और के त्रुटि डोमेन के साथ संघर्ष नहीं करने जा रहा हूं (यदि मैं 3 पार्टी कोड का उपयोग कर रहा हूं), जब तक कि डेवलपर जानबूझकर सिर्फ मेरे साथ गड़बड़ करने की कोशिश नहीं कर रहा है (जो मुझे लगता है कि अत्यधिक संभावना नहीं होगी। ..)।

कोड संख्या संघर्ष के लिए के रूप में, उस के बारे में चिंता मत करो। जब तक किसी डोमेन में कोड अद्वितीय होते हैं , तब तक आपको ठीक होना चाहिए।

अनुवाद की त्रुटियों के लिए, आप पर निर्भर है। आप जो कुछ भी करते हैं, सुनिश्चित करें कि आप इसे अच्छी तरह से दस्तावेज करते हैं। व्यक्तिगत रूप से , मैं आमतौर पर फ्रेमवर्क-जनित त्रुटियों से गुजरता हूं क्योंकि वे मेरे पास आए थे, क्योंकि मुझे कभी भी यकीन नहीं है कि मैं सभी कोड संभाल लूंगा और सभी userInfo के अनुवाद को अपनी परियोजना के लिए और अधिक विशिष्ट में बदल दूंगा। फ्रेमवर्क बदल सकते हैं और अधिक कोड जोड़ सकते हैं, या मौजूदा कोड के अर्थ को बदल सकते हैं, आदि। यह मुझे और अधिक विशेष रूप से पहचानने में मदद करता है कि त्रुटि कहां से आई है। उदाहरण के लिए, यदि मेरा StackKit फ्रेमवर्क com.stackkitडोमेन में कोई त्रुटि उत्पन्न करता है, तो मुझे पता है कि यह एक फ्रेमवर्क समस्या है। हालाँकि, यदि यह इसमें कोई त्रुटि उत्पन्न करता है NSURLErrorDomain, तो मुझे पता है कि यह विशेष रूप से URL लोडिंग तंत्र से आया है।

आप जो भी कर सकते हैं, वह फ्रेमवर्क जनरेट की गई त्रुटि को कैप्चर करें और इसे एक नई त्रुटि ऑब्जेक्ट में लपेटें जिसमें आपका डोमेन और जेनेरिक कोड हो, जैसे kFrameworkErrorCodeUnknownकुछ या कुछ और फिर कैप्चर की गई त्रुटि को इसके userInfoअंतर्गत रखें NSUnderlyingErrorKey। CoreData यह एक बहुत कुछ करता है (उदाहरण के लिए, यदि आप save:एक करने की कोशिश करते हैं NSManagedObjectContext, लेकिन आपके पास संबंध अखंडता त्रुटियां हैं, तो आपको एक त्रुटि वापस मिल NSUnderlyingErrorKeyजाएगी , लेकिन इसमें बहुत अधिक जानकारी होगी, जैसे विशेष रूप से कौन से रिश्ते गलत हैं, आदि)।


चूंकि सेब रिवर्स डीएनएस का भी उपयोग करता है, इसलिए यह अन्य के लिए भी इस शैली का उपयोग करने के लिए उपयुक्त लगता है।
जोहान कार्लसन 7

36

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन डेव देलांग द्वारा स्वीकार किए गए उत्तर के लिए, इसके [[NSBundle mainBundle] bundleIdentifier]बजाय इसका उपयोग करना थोड़ा बेहतर हो सकता है @"com.myName.myProject"। इस तरह, यदि आप अपना नाम या प्रोजेक्ट का नाम बदलते हैं, तो यह सटीक रूप से परिलक्षित होगा।


4
अच्छा विचार। यदि आप स्विफ्ट का उपयोग कर रहे हैं, तो आपको अलिखित वैकल्पिक का उपयोग करना चाहिए: NSBundle.mainBundle().bundleIdentifier!(यदि आप जानते हैं कि बंडल पहचानकर्ता सेट है, जो मुझे लगता है कि सबसे अधिक संभावना है)
Juul

आप त्रुटि डोमेन में प्रोजेक्ट नाम परिवर्तन क्यों दिखाना चाहते हैं?
zrslv 14

1
@zrxq सुनिश्चित करने के लिए अलग-अलग त्रुटि डोमेन होने में मूल्य है, लेकिन कल्पना कीजिए कि आपने अपनी परियोजना को गलत कर दिया है या आपने अपना नाम बदल दिया है, यह हर जगह परिलक्षित होता है। बेहतर यह गतिशील रूप से हार्ड कोडित की तुलना में निर्धारित है।
कोनोर

1
@ बहुत स्पष्ट है, मुझे वास्तव में समझ में नहीं आता है कि क्या व्यावहारिक लाभ प्रदान करेगा। मेरी समझ उन पहचानकर्ताओं को सिर्फ ऐप के संदर्भ में अद्वितीय होने की आवश्यकता है, बस। ठीक है, शायद आप बस उन्हें अधिक सौंदर्यवादी रूप से प्रसन्न करना चाहते हैं, मुझे मिल गया!
zrslv

1
हाँ, आप एक अच्छी बात लाते हैं। ऐसे समय होते हैं जब आप चाहते हैं कि डोमेन अद्वितीय हो, मैं मानूंगा ... उदाहरण के लिए यदि आप एक एसडीके या कोको (कोको) पॉड बना रहे हैं, तो आप चाहते हैं कि आपका त्रुटि डोमेन प्रतिबिंबित करे कि यह कहां से आया है, परियोजना का नहीं नाम दें। संपादित करें: मैं (मेरे उत्तर में) यह भी बताना चाहता था कि @ "com.myName.myProject" इस मामले में बंडलइंटरिफायर के समान है, जिसे लोग नहीं जानते होंगे।
कॉनर

4

कैसे एक कस्टम NSError बनाने के लिए:

पहले त्रुटि संदेश का एक शब्दकोश बनाएँ

NSDictionary *userInfo = @{   
   NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil)
                                               };
NSError *error = [NSError errorWithDomain:[[NSBundle mainBundle] bundleIdentifier] 
  code:-58 userInfo:userInfo];

फिर NSIn और अपने किए हुए userInfo को असाइन करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.