如果可以,请避免异常。甚至 Apple 也建议避免使用它们:
代替异常,错误对象(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;
}