2012-02-12 5 views
5

कोको में और उद्देश्य सी त्रुटि के प्रबंधन के लिए पसंदीदा विधि एक NSError * वस्तु का उपयोग करने की, फिर भी एक त्रुटि वस्तु के निर्माण के लिए लगता है में NSError के लिए त्रुटि कोड की सूची प्रबंधित करना, हम निम्न विधिउद्देश्य सी

+ (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict 
कॉल करने की आवश्यकता

मेरा प्रश्न है, पूरे डोमेन में त्रुटि डोमेन, त्रुटि कोड परिभाषाओं और उपयोगकर्ता जानकारी शब्दकोश के प्रबंधन के लिए कुछ सर्वोत्तम प्रथाएं क्या हैं ताकि त्रुटि कोड, डोमेन और उपयोगकर्ता जानकारी निर्देश हमेशा स्थिर रहे?

उत्तर

10

यदि आपके पास भारी संख्या में त्रुटि निर्माण है, तो कक्षा का उपयोग करके आपका जीवन अधिक सरल हो सकता है। मैं वास्तव में इस के लिए सी ++ उपयोग करती हैं इसलिए कॉल एक कार्यक्रम की जरूरत नहीं है हटाया जा सकता है (ObjC के विपरीत), लेकिन आप सी, ObjC, या इस के लिए सी ++ का उपयोग कर सकते हैं:

MONErrorDomain.h

// you won't normally need an instance here 
@interface MONErrorDomain : NSObject 

+ (NSString *)domain; // << required override 
- (NSString *)domain; // << returns [[self class] domain] 

// example convenience methods: 
// uses [self domain] 
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode; // << user info would be nil 
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode userInfo:(NSDictionary *)userInfo; 

@end 

MONKoalaError.h

@interface MONKoalaError : MONErrorDomain 

+ (NSError *)outOfEucalyptus; 

@end 

extern NSString * const MONKoalaErrorDomain; 

typedef enum MONKoalaErrorCode { 
    MONKoalaErrorCode_Undefined = 0, 
    MONKoalaErrorCode_OutOfEucalyptus 
} MONKoalaErrorCode; 

MONKoalaError.m

// apple recommends we use reverse domains 
NSString * const MONKoalaErrorDomain = @"com.mon.koala-library.MONKoalaErrorDomain"; 

@implementation MONKoalaError 

+ (NSString *)domain 
{ 
    return MONKoalaErrorDomain; 
} 

+ (NSError *)outOfEucalyptus 
{ 
    NSDictionary * info = …; 
    return [self errorWithErrorCode:MONKoalaErrorCode_OutOfEucalyptus userInfo:info]; 
} 

@end 

तो त्रुटि निर्माण सभी प्रत्येक डोमेन के लिए एक ही स्थान पर है, और ग्राहकों को आसानी से वास्तव में उन्हें मैन्युअल रूप से निर्माण बिना उनके त्रुटियों चुन सकते हैं:

if ([e.domain isEqualToString:MONKoalaErrorDomain]) { 
    switch (e.code) { 
    case MONKoalaErrorCode_OutOfEucalyptus : { 
     self.needsEucalyptus = true; 
… 
:

if (outError) { 
    *outError = [MONKoalaError outOfEucalyptus]; 
} 

और त्रुटि हैंडलिंग रूप ले लेता है

+1

बस एक छोटी सी टिप्पणी: जबकि एक एनएसईआरआरआर त्रुटि कोड प्रोग्राम निकास कोड द्वारा भ्रमित नहीं किया जाना चाहिए, मुझे लगता है कि यह 0 के बराबर त्रुटि कोड होने के लिए सहज ज्ञान युक्त काउंटर है। मुझे एक अपरिभाषित त्रुटि के लिए -1 होना पसंद है। – Alerty

+0

@Alerty '0' का उपयोग अपरिभाषित के लिए किया जाता है क्योंकि यह एक अधिक अनुमानित मूल्य है जब कोई प्रोग्रामर तर्क त्रुटि उत्पन्न करता है (उदा। संदेश 'शून्य' या डीबग में डिफ़ॉल्ट प्रारंभिक स्मृति का उपयोग करता है)। यह कहना है कि त्रुटि को 'MONKoalaErrorCode_Undefined' कभी वापस नहीं करना चाहिए यदि यह वास्तव में' MONKoalaErrorCode' की त्रुटि है। – justin

3

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

const NSString * kMyAppErrorDomain = @"com.example.myapp"; 
const NSInteger kMyAppSomeError = 2; 

// key into user info dictionary 
const NSString * kMyAppProblemKey = @"MyAppProblemKey"; 

मैं भी, जो इन बनाने के लिए सुविधा के तरीकों बनाने के कुछ अनुप्रयोगों को देखा है या तो NSError पर एक वर्ग के रूप में या एक अलग उपयोगिता वर्ग के रूप में या कार्यों की स्थापना की। NSError उपclass करने के लिए यह पूरी तरह से उचित है, उदाहरण के लिए स्थानीय विवरण को कस्टमाइज़ करने के लिए।

यदि आपने इसे पहले से नहीं देखा है, तो ऐप्पल ने Error Handling Programming Guide जारी किया है जो चर्चा करता है कि कोको में इनका उपयोग कैसे किया जाना चाहिए।

+0

आह, त्रुटि प्रबंधन मार्गदर्शिका वास्तव में सहायक है। धन्यवाद! – Tony