हे अपर में एनएसईआरआर बनाम अपवाद हैंडलिंग का उपयोग करना। मैं ऐप्पल के सुझावों पर पढ़ रहा हूं कि एनएसईआरर बनाम @ try/@ catch/@ अंत में कब/कहां/कैसे उपयोग करें। अनिवार्य रूप से, मेरी धारणा यह है कि ऐप्पल अनपेक्षित त्रुटि स्थितियों में प्रोग्राम निष्पादन को रोकने के लिए एक तंत्र के रूप में छोड़कर अपवाद हैंडलिंग भाषा संरचनाओं के उपयोग से बचने के लिए सबसे अच्छा सोचता है (शायद कोई ऐसी स्थिति का उदाहरण दे सकता है?)कोको ऐप्स
मैं आ गया जावा से, जहां अपवादों को संभालने के लिए अपवाद होते हैं। माना जाता है कि, मैं अभी भी जावा विचारस्थान में हूं, लेकिन मैं धीरे-धीरे उन सभी एनएसईआरआरआर के साथ पकड़ने के लिए आ रहा हूं।
एक चीज जिसे मैं लटका रहा हूं वह एक त्रुटि होने पर स्मृति को साफ करने का कार्य है। कई परिस्थितियों में (उदाहरण के लिए सी, सी ++ लाइब्रेरीज़, कोरफाउंडेशन इत्यादि का उपयोग करना ..) आपके पास बहुत मेमोरी क्लीनअप है जो किसी त्रुटि के कारण किसी फ़ंक्शन को तोड़ने से पहले करने की आवश्यकता है।
यहां एक उदाहरण है जिसे मैंने पकाया है जो सटीक रूप से उन परिस्थितियों को प्रतिबिंबित करता है जो मुझे सामना कर रहा है। कुछ काल्पनिक डेटा संरचनाओं का उपयोग करके, फ़ंक्शन एक फ़ाइल हैंडल खोलता है और 'MyFileRefInfo' ऑब्जेक्ट बनाता है जिसमें फ़ाइल के साथ क्या करना है इसके बारे में जानकारी शामिल है। फ़ाइल हैंडल बंद होने से पहले फ़ाइल के साथ कुछ सामान किया जाता है और संरचना के लिए स्मृति मुक्त हो जाती है। एप्पल के सुझावों का प्रयोग मैं इस विधि है:
- (BOOL)doSomeThingsWithFile:(NSURL *)filePath error:(NSError **)error
{
MyFileReference inFile; // Lets say this is a CF struct that opens a file reference
MyFileRefInfo *fileInfo = new MyFileRefInfo(...some init parameters...);
OSStatus err = OpenFileReference((CFURLRef)filePath ,&inFile);
if(err != NoErr)
{
*error = [NSError errorWithDomain:@"myDomain" code:99 userInfo:nil];
delete fileInfo;
return NO;
}
err = DoSomeStuffWithTheFileAndInfo(inFile,fileInfo);
if(err != NoErr)
{
*error = [NSError errorWithDomain:@"myDomain" code:100 userInfo:nil];
CloseFileHandle(inFile); // if we don't do this bad things happen
delete fileInfo;
return NO;
}
err = DoSomeOtherStuffWithTheFile(inFile,fileInfo);
if(err != NoErr)
{
*error = [NSError errorWithDomain:@"myDomain" code:101 userInfo:nil];
CloseFileHandle(inFile); // if we don't do this bad things happen
delete fileInfo;
return NO;
}
CloseFileHandle(inFile);
delete fileInfo;
return YES;
}
अब
.. मेरी जावा तर्क मुझसे कहता है कि यह बेहतर होगा आज़माएं/कैच/अंत में संरचना के रूप में इस की स्थापना की और फ़ाइल हैंडल बंद करने के लिए सभी कॉल्स डाल करने के लिए और आखिरकार ब्लॉक में मुफ्त मेमोरी।
तो जैसा..
...
@try
{
OSStatus err = OpenFileReference((CFURLRef)filePath ,&inFile);
if(err != NoErr)
{
... throw some exception complete with error code and description ...
}
err = DoSomeStuffWithTheFileAndInfo(inFile,fileInfo);
if(err != NoErr)
{
... throw some exception ...
}
... etc ...
}
@catch(MyException *ex)
{
*error = [NSError errorWithDomain:@"myDomain" code:[ex errorCode] userInfo:nil];
return NO;
}
@finally
{
CloseFileHandle(inFile); // if we don't do this bad things happen
delete fileInfo;
}
return YES;
Am मैं यह सोच कर कि यह कम अनावश्यक कोड के साथ एक अधिक सुरुचिपूर्ण समाधान है में पागल हो? क्या मुझे कुछ याद आया?
उदाहरण को थोड़ा सा सरल बनाया गया हो सकता है, लेकिन यह जांचना न भूलें कि त्रुटि इसे आवंटित करने से पहले पूर्ण नहीं है, क्योंकि जब आप त्रुटियों की परवाह नहीं करते हैं तो सम्मेलन त्रुटि चर के स्थान पर NULL भेजना है । यदि आप इस मामले में न्यूल को अस्वीकार करते हैं, तो आप बस गलती का कारण बनेंगे (यह एक शून्य ऑब्जेक्ट मैसेजिंग की तरह नहीं है)। –