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. } 

以及实际使用例外的链接:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html

如果可以的话,避免例外。 即使苹果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来辨别出哪一行失败了。