2012-03-13 140 views
5

我得知目标C具有处理异常的等效方式,如C#.NET中一样。 此外,正如苹果文档所说,我想处理/处理异常,创建一个NSError对象。 仔细看看“捕捉不同类型的例外”部分 在文档中exception handlingiOS中异常处理的正确方法是什么?

....我想捕捉不同类型的异常。在.NET中,我习惯浏览类方法的文档以获得可能引发的异常。 从apple-docs中获取此信息的位置? 我怎么知道,a-method/object/process-可以引发什么样的异常?

感谢您的建议

汤姆

回答

5

苹果的文件说,最引发异常情况除外。 (有些例外都没有,就像访问一个对象的NSArray出界。)

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

一个好的经验法则是它不清楚你会怎么连恢复可可只抛出的情况例外。 (不要把这个错误抛诸如地,因为.NET 这样的例外很难处理。)

+0

感谢您的输入! – Tom 2012-03-13 15:02:15

2

看那developer reference for exception handling。在可可我们没有得到像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类,在下面的意见之一建议,捕捉自定义异常。

+1

没有什么可以阻止你继承NSException并在自己的代码中的'@ catch'块捕捉特定类型。 – 2012-03-13 09:42:42

+0

感谢您的回答 – Tom 2012-03-13 15:03:13

+0

@GrahamLee。你说得很对。你一定可以延长。也开始关注你的博客:) – Vignesh 2012-03-14 06:27:19

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:]),文件中提到的事实,但我不认为你预计将分析异常不亚于其他语言习惯。

+0

嗨祖尔,谢谢你的回答。只是为了我自己的保证 - >这意味着一个好的做法是在我的项目中的所有代码周围构建一个try&catch块形式 - (如果我忘记处理正确的事情 - 比如检查null值)以防止软件崩溃。否则我会继续进行开发并且不再担心异常处理? - 或者只是围绕我的main方法建立一个try和catch-block,因为无用的异常最终会在那里结束(然后记录它或向用户显示一条消息) – Tom 2012-03-13 14:58:58

+0

在Objective- C,向“无”对象发送消息是合法的。这有时是一个很好的节省时间,有时候还有一个不错的bug等待发生。在Objective-C中,你大多会忘记try/catch块。每当你调用可能失败的东西时,请看看如何返回错误。在大多数情况下,你会得到一个'NSError',所以从方法签名中就很明显。在很少的剩余情况下,文档会告诉你方法可能会抛出,所以你需要一个try/catch块。再次,这种情况很少见。 – zoul 2012-03-13 15:29:25

+0

感谢您的输入,欢呼! – Tom 2012-03-14 16:19:08

相关问题