iOS中异常处理的正确方法是什么?

Tom*_*Tom 5 error-handling exception objective-c ios

我了解到Objective C有一种处理异常的方法,比如.NET中的C#.此外,正如apple docs所说,我想处理/处理异常,创建一个NSError对象.仔细查看文档异常处理中的"捕获不同类型的异常"部分

....我想抓住不同类型的例外.在.NET中,我习惯于浏览类方法的doc,以获得它可能引发的异常.哪里可以从apple-docs获取这些信息?我如何知道-method/object/process-可以引发什么样的异常?

谢谢你的建议

汤姆

Jes*_*per 5

正如Apple的文档所述,大多数异常都是在特殊情况下引发的.(有些例外不是,比如从NSArray边界访问对象.)

.NET鼓励本地异常处理.编写Cocoa是为了鼓励大范围的异常处理.您在.NET中进行本地异常处理的原因是您希望某些部分以预期的方式失败(例如下载内容时出现网络错误).在Cocoa中,这是通过使用返回NSErrors的方法来处理的.它是一样的,只在方法签名中更明显.

一个好的经验法则是Cocoa只会在你不清楚如何恢复的情况下抛出异常.(不要误以为这是因为.NET中的异常被抛出而且很难处理.)


zou*_*oul 5

Objective-C世界中的错误处理可能与您习惯的完全不同.简而言之,忘记例外.大多数错误由返回值处理或通过将指针传递给NSError*:

NSErrror *error = nil;
BOOL success = [somebody doSomethingWithError:&error];
if (!success) {
    NSLog(@"Got error: %@", error);
}
Run Code Online (Sandbox Code Playgroud)

而在被叫方:

- (BOOL) doSomethingWithError: (NSError**) error
{
    error = error ? error : &(NSError*){ nil };
    if (somethingWentWrong) {
        *error = [NSError …];
        return NO;
    }
    // All is fine
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

这看起来很麻烦,但在实践中它大部分工作正常.在极少数情况下,某些事情确实会引发异常(如[NSFileHandle writeData:]),文档提到了这一事实,但我认为您不会像其他语言中的习惯那样分析异常.