iPhone-尝试,抓住问题

| 我有一个方法,它有几个部分可能引发异常。如果这些部件之一发生故障,我希望运行清洁方法。我正在考虑使用try / catch指令。 我的问题是:我必须对可能引发异常的每一行代码使用一个指令,还是可以将整个方法简单地包含在这样的块中?
 @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     
        如果可以,请避免出现异常。甚至苹果公司也建议避免使用它们:   建议使用错误对象(NSError)和Cocoa错误传递机制来代替异常,以在Cocoa应用程序中传达预期的错误。 另请参见其错误处理编程指南(它被标记为与Mac相关,但对iPhone同样有效,适用相同的概念)。 据我所知,避免出现异常的原因是: 它们比通过NSError和出站指针报告要慢。 如果您不太小心,它们可能会导致内存泄漏。由于异常导致的某些内存泄漏根本无法避免(在非GC环境中)。 您可能会忘记抓住它们,然后您的应用程序崩溃。 通常,Objective-C中的异常用于通常无法恢复的异常问题。在您可能会出错的区域中,几乎从未使用过它们(例如网络通信;
NSURLConnection
方法因此不会抛出异常,而是输出
NSError
)。这可能与其他使用例外的语言不同。在我一直从事的项目中,只有一次需要捕获和处理异常(但是不记得是哪个)。 相反,您应该执行以下操作:
// 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块将方法调用括起来。     
        如果您不关心哪一行导致了异常,则可以将整个函数包含在try / catch块中。 例如,假设f1(),f2()或f3()可以在此代码中引发异常:
try {
   f1();
   f2();
   f3();
}
catch( ... ) {

 ...either f1, f2 or f3 threw an exception - don\'t know which
}
    
        您可以在ѭ6include块中包含整个方法主体。 在
catch
部分中,您可以具有多个
catch
块来处理不同类型的异常:
 @catch (NSException * e) {
   ....
 }
 @catch (OtherException * e) {
    ....
 }
 @finally {
    NSLog(@\"finally\");
 }
因此,如果需要,您还可以根据引发的特定异常确切地确定哪条线失败。     
        http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html 您可以在try块中包括整个方法主体。     

要回复问题请先登录注册