我了解到Objective-C有一种处理异常的方法,比如.NET中的C#。 此外,正如apple docs所说,我想处理/处理异常,创建一个NSError对象。 仔细研究“捕捉不同类型的例外”部分 在文档exception handling
中....我想捕捉不同类型的异常。在.NET中,我习惯于浏览类方法的doc,以获得它可能引发的异常。 哪里可以从apple-docs获取这些信息? 我如何知道-method / object / process-可以引发什么样的例外?
答案 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类,以捕获自定义异常。