iphone – 试试看,问题
我有一个方法,有几个部分,可以抛出一个exception。 如果其中一个部件失效,我希望清洗方法运行。 我正在考虑使用try / catch指令。
我的问题是:我将不得不使用一个指令的每一行代码,可以抛出一个exception,或者我可以简单地包括在这样的块的整个方法?
@try { [self doStuff]; // doStuff has several passages that could throw an exception } @catch (NSException * e) { [self cleanTheWholeThing]; }
在这种情况下,哪一行产生问题对我来说并不重要。 我只需要方法运行成功或做其他的东西,以防万一失败。
谢谢
你可以在你的try块中有多行。 例:
@try { if (managedObjectContext == nil) { actionMessage = @"accessing user recipe library"; [self initCoreDataStack]; } actionMessage = @"finding recipes"; recipes = [self recipesMatchingSearchParameters]; actionMessage = @"generating recipe summaries"; summaries = [self summariesFromRecipes:recipes]; } @catch (NSException *exception) { NSMutableDictionary *errorDict = [NSMutableDictionary dictionary]; [errorDict setObject:[NSString stringWithFormat:@"Error %@: %@", actionMessage, [exception reason]] forKey:OSAScriptErrorMessage]; [errorDict setObject:[NSNumber numberWithInt:errOSAGeneralError] forKey:OSAScriptErrorNumber]; *errorInfo = errorDict; return input; } @catch (OtherException * e) { .... } @finally { // Any clean up can happen here. // Finally will be called if an exception is thrown or not. }
以及实际使用例外的链接:
如果可以的话,避免例外。 即使苹果build议避免它们 :
错误对象(NSError)和Cocoa错误传递机制是Cocoa应用程序中预期错误的推荐方式,而不是exception。
另请参阅error handling编程指南 (它被标记为与Mac相关,但同样适用于iPhone,适用相同的概念)。
避免例外的原因是我知道的是:
- 它们比通过NSError和out-pointer报告慢。
- 如果你不太小心,可能会导致内存泄漏。 由于例外而导致的一些内存泄漏根本无法避免(在非GC环境中)。
- 你可能忘记抓住他们,然后你的应用程序崩溃。
通常,Objective-C中的exception用于非常特殊的问题,而这些问题通常是不可恢复的。 他们几乎从来没有用在你期望出现问题的地方(比如networking通信; NSURLConnection
方法不会因为这个原因而抛出exception,而是导出一个NSError
)。 这可能与其他语言有所不同,例外情况会更频繁。 在我一直在做的项目中,我只有一次需要捕捉和处理exception(虽然不记得哪个)。
相反,你应该这样做:
// Returns YES when successful. - (BOOL)doSomething:(NSError **)outError { // ... if (someErrorOccurred) { if (outError) { outError = [NSError errorWithDomain:@"MyErrorDomain" code:123 userInfo:nil ]; // Or maybe even use your own NSError subclass return NO; } } // ... // Operation was successful. return YES; }
用try-catch块封装方法调用完全可以。
如果你不关心哪一行导致exception,你可以把整个函数放在try / catch块中。
例如,假设f1(),f2()或f3()可以在此代码中引发exception:
try { f1(); f2(); f3(); } catch( ... ) { ...either f1, f2 or f3 threw an exception - don't know which }
你可以在你的try
块中包含整个方法体。
在你的catch
部分你可以有多个catch
块来处理不同types的exception:
@catch (NSException * e) { .... } @catch (OtherException * e) { .... } @finally { NSLog(@"finally"); }
所以如果你需要的话,你也可以根据提出的具体exception来辨别出哪一行失败了。