2011-01-17 15 views
5

मैं इस तरह से निपटने मेरी त्रुटि कोडिंग के आदत में मिल गया:एनएसईआरआरआर: त्रुटि का पता लगाने के लिए शून्य का उपयोग करना वास्तव में त्रुटि रिपोर्टिंग बंद कर देता है?

NSError* error = nil; 
NSDictionary *attribs = [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error]; 
if (error != nil) { 
    DLogErr(@"Unable to remove file: error %@, %@", error, [error userInfo]); 
    return; 
} 

लेकिन प्रलेखन यह मैं की तरह लगता है पर देख रहे हैं यह गलत .:

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error 

If an error occurs, upon return contains an NSError object that describes the problem. Pass NULL if you do not want error information.

तकनीकी तौर पर कोई मिल गया शून्य और न्यूल के बीच अंतर तो क्या इसका मतलब यह है कि मैं वास्तव में इसे बंद कर रहा हूं और कभी भी एक त्रुटि संदेश नहीं मिलेगा (भले ही उपर्युक्त उदाहरण में डिलीट विफल हो)? क्या यह कोड करने का कोई बेहतर तरीका है?

धन्यवाद।

+1

'nil' और' NULL', और 'Nil' के बीच अंतर नहीं है। उदाहरण के लिए 'शून्य' है, 'नील' वर्ग वस्तु के लिए है, 'नूल' किसी अन्य चीज के लिए है। चूंकि 'त्रुटि' स्मृति पता है, ऑब्जेक्ट नहीं, भयानक शुद्धता – Philip007

उत्तर

13

पहले, निम्न पंक्ति वास्तव में कोई मतलब नहीं है।

मुझे लगता है कि मैं देखता हूं कि आप NULL मान के साथ क्या सोच रहे हैं। हालांकि सावधानी से ध्यान दें, कैसे वहाँ विधि हस्ताक्षर में त्रुटि पैरामीटर में 2 * की हैं:

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error 

एक सूचक के लिए सूचक इसका मतलब है कि। जब आप &error में पास करते हैं, तो आप पॉइंटर के पते में NSError पर जा रहे हैं।(उह, कोई और शायद यहां मेरी मदद कर सकता है, क्योंकि पॉइंटर्स से पॉइंटर्स से निपटने के दौरान मेरा सिर अभी भी तैरना शुरू कर देता है)। दूसरे शब्दों में, भले ही आपने errornil पर सेट किया है, फिर भी आप error में विधि में नहीं जा रहे हैं, आप &error में गुजर रहे हैं।

तो, यहाँ क्या फिर से लिखा विधि कैसा दिखना चाहिए:

// If you want error detection: 
NSError *error = nil; 
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath 
      error:&error]) { 
    NSLog(@"failed to remove item at path; error == %@", error); 
    // no need to log userInfo separately 
    return; 
} 

// If you don't: 
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath 
      error:NULL]) { 
    NSLog(@"failed to remove item at path"); 
    return; 
} 
+0

बूल लौटने की विधि के बारे में अच्छी पकड़! मैं पूरी तरह से याद किया। –

0

नहीं, मैं इसे वही करता हूं और यह त्रुटियों का पता लगाने के लिए ठीक काम करता है। आप इसे पूरा नहीं कर रहे हैं आप इसे एक पॉइंटर पास कर रहे हैं जो कि एक बहुत ही अलग बात है। हालांकि एक और विकल्प जो आप जोड़ना चाहते हैं।

if (error != nil){... 
}else{ 
    [NSApp presentError:error] 
} 
9

NULL पासिंग निम्न अर्थ है:

BOOL itemRemoved = [[NSFileManager defaultManager] removeItemAtPath:fullPath 
    error:NULL]; 

अर्थात, error पैरामीटर NULL है। आंतरिक रूप से, -removeItemAtPath:error: देखता है कि एक वैध सूचक पारित किया गया था या नहीं। यदि यह NULL है, तो यह त्रुटि को NSError उदाहरण के रूप में रिपोर्ट नहीं करेगा - लेकिन वापसी मान इंगित करेगा कि विधि सफलतापूर्वक पूर्ण हुई है या नहीं।

इसके अलावा, आपका परीक्षण गलत है। यदि कोई त्रुटि हुई है तो यह पता लगाने के लिए आपको error आउटपुट पैरामीटर का उपयोग नहीं करना चाहिए क्योंकि यह सेट हो सकता है भले ही विधि सफलतापूर्वक पूर्ण हो। इसके बजाय, आपको त्रुटियों का पता लगाने के लिए विधि के वापसी मूल्य का उपयोग करना चाहिए। ,

Important: Success or failure is indicated by the return value of the method. Although Cocoa methods that indirectly return error objects in the Cocoa error domain are guaranteed to return such objects if the method indicates failure by directly returning nil or NO, you should always check that the return value is nil or NO before attempting to do anything with the NSError object.

NSError *error = nil; 
BOOL itemRemoved = [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error]; 
if (itemRemoved == NO) { 
    DLogErr(@"Unable to remove file: error %@, %@", error, [error userInfo]); 
    return; 
} 

Error Handling Programming Guide का हवाला देते हुए


संपादित: अगर वापसी मान (इस विशेष मामले में) NO है, तो त्रुटि के बारे में जानकारी प्राप्त करने के error उत्पादन पैरामीटर का उपयोग : जैसा कि एनएसजीओडी ने बताया, -removeItemAtPath:error:BOOL लौटाता है, NSDictionary * नहीं। मैंने अपना जवाब उस प्रतिबिंबित करने के लिए भी संपादित किया है।

NSDictionary *attribs = [[NSFileManager defaultManager] 
removeItemAtPath:fullPath error:&error]; 

-removeItemAtPath:error: एक बूल मान, नहीं एक शब्दकोश रिटर्न:

+0

+1 का उपयोग करें, बहुत अच्छा धन्यवाद। क्या आपके पास एक छोटा सा उदाहरण है कि कॉल में पहचान कोड कैसा दिख सकता है? क्या टी (एनएसईआरआर **) त्रुटि घोषणा के कारण टी है कि पॉइंटर के बीच शून्य और शून्य के बीच अंतर करना संभव है? –

+0

ग्रेट स्पष्टीकरण के लिए 'NULL' – EtienneSky

+0

@EtienneSky मेरा जवाब दिखाता है कि वापसी मूल्य का निरीक्षण करके कोई त्रुटि आई है या नहीं। एनएसजीओडी का जवाब भी ऐसा करता है लेकिन वापसी मूल्य को स्टोर करने के लिए एक चर का उपयोग किए बिना। और हां, 'NSError ** 'आपको' nil' ऑब्जेक्ट ('NSError *') के बीच अंतर करने और 'NSError *' ऑब्जेक्ट (यानी, 'NSError **') के लिए एक सूचक को अलग करने की अनुमति देता है, जो एक मान्य सूचक हो सकता है , या 'NULL' इंगित करने के लिए आउटपुट पैरामीटर में किसी ऑब्जेक्ट को स्टोर करने की आवश्यकता नहीं है। –