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

时间:2012-03-13 09:10:10

标签: objective-c ios exception error-handling

我了解到Objective-C有一种处理异常的方法,比如.NET中的C#。 此外,正如apple docs所说,我想处理/处理异常,创建一个NSError对象。 仔细研究“捕捉不同类型的例外”部分 在文档exception handling

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

3 个答案:

答案 0 :(得分:5)

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

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

一个好的经验法则是,Cocoa只会在你不清楚如何恢复的情况下抛出异常。 (不要将此错误归咎于在.NET 这样难以处理的地方抛出异常。)

答案 1 :(得分:5)

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

来处理
NSErrror *error = nil;
BOOL success = [somebody doSomethingWithError:&error];
if (!success) {
    NSLog(@"Got error: %@", error);
}

在被叫方:

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

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

答案 2 :(得分:2)

查看developer reference for exception handling。在cocoa中,我们不会获得nilArgumentException之类的异常,我们只获得NSException。要提供细粒度的消息或处理,您可以执行以下操作,

if ([[exception name] isEqualToString:MyAppException]) 

下面是NSException头文件中定义的异常名称列表。

FOUNDATION_EXPORT NSString * const NSGenericException;
FOUNDATION_EXPORT NSString * const NSRangeException;
FOUNDATION_EXPORT NSString * const NSInvalidArgumentException;
FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException;

FOUNDATION_EXPORT NSString * const NSMallocException;

FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException;
FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException;
FOUNDATION_EXPORT NSString * const NSDestinationInvalidException;

FOUNDATION_EXPORT NSString * const NSPortTimeoutException;
FOUNDATION_EXPORT NSString * const NSInvalidSendPortException;
FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException;
FOUNDATION_EXPORT NSString * const NSPortSendException;
FOUNDATION_EXPORT NSString * const NSPortReceiveException;

FOUNDATION_EXPORT NSString * const NSOldStyleException;

更正:

您可以按照以下评论之一的建议继承NSException类,以捕获自定义异常。