1

在此之前,请原谅我对 iPhone/Objective-C 最佳实践缺乏了解;我来自 .NET/C# 背景。

虽然,我已经阅读了很多关于 iPhone 异常处理的帖子,但我仍然不清楚大多数人为生产代码做了什么。此外,我还没有找到任何具有我通常期望的错误处理的开源应用程序。以下是我的问题:

1)如果出现意外结果导致应用程序最终失败,你会抛出异常还是等待它稍后失败?例如,

if (![fileManager createDirectoryAtPath: myNewDir
    withIntermediateDirectories: YES 
    attributes: nil 
    error: &myError]) {

    // My app shouldn't continue. Should I raise an exception? 
    // Or should I just log it and then wait for it to crash later?
}

2)你验证参数吗?例如,在 C# 中,我通常会检查 null,如果需要,会抛出 ArgumentNullException。

3) 当应用程序崩溃时,崩溃信息会自动记录还是我需要设置未处理的异常处理程序?我可以在这个方法中显示一个 UIAlertView 来通知用户发生了一些不好的事情,而不是让应用程序消失吗?(如果是这样,我无法让它工作。)

4) 最后,为什么我没有看到有人实际使用@try/@catch/@finally?它在 C# 中被广泛使用,但我还没有找到使用它的开源应用程序。(也许我只是在看错误的应用程序。)

4

2 回答 2

2

广告 1. 您给出的示例是一个有点经典的示例,说明何时应该在 Java 中使用“检查异常”。方法的调用者必须做好准备,调用可能会由于超出其无法控制的原因而失败。特别是,在给出的示例中,我将允许错误描述符对象允许传播回调用者:

- (BOOL) prepareDirectories: (NSString*) path error: (NSError**) location {

    if( ![fileManager createDirectoryAtPath: path
                      withIntermediateDirectories: YES 
                      attributes: nil 
                      error: location] ) {

        return NO;
    }

    // ... additional set-up here
    return YES;
}

如果错误确实不可恢复,您实际上可能会引发异常,但这也将失去向应用程序用户显示正确错误消息的任何机会。

广告 2. 是的,参数验证绝对是您应该做的事情。并且为 unexpected s 引发异常nil是完全合适的。错误的参数是“程序员的错误”,您不能保证程序仍处于一致状态。例如NSArray,如果您尝试使用不存在的索引获取元素,则会引发异常。

广告 3. 当应用程序由于未捕获的异常而崩溃时,会自动记录该事实。如果您真的想显示错误消息,您可以捕获异常。但是,该应用程序很可能处于不一致的状态,并且不应被允许继续运行,因此简单地让它关闭似乎是最好的解决方案。

广告 4。我不知道。

于 2010-06-22T19:00:33.440 回答
1
  1. 在您提到的特定情况下,您应该向用户显示刚刚发生的事情以及如何解决问题的说明。除非在极端情况下,您的应用不应退出。您应该让用户修复任何错误,然后重试。
  2. 参数验证取决于很多因素。要记住的一件事是,在 Obj-C 中,向其发送消息是完全有效的nil(如果您这样做,则不会发生任何事情),因此在很多情况下您不需要检查 nil。如果我在模型类中,我总是验证方法中的参数。如果我不是,我几乎从不验证任何东西,类型检查就足够了。
  3. 应该记录一些信息,但记录更多针对您的情况的具体信息总是有帮助的。理想情况下,您永远不应该达到未处理的异常状态。
  4. Cocoa 类很少会因为环境原因抛出异常,它们几乎总是因为你做错了什么。例如,您通常不会放置 @try/@catch 块,[NSString stringWithString:]因为它引发异常的唯一方法是您尝试并通过nil. 确保您没有通过nil,并且您不必担心捕获异常。当一个方法可能因为你无法控制的事情而失败时,它们通常通过 NSError 进行通信。参见例如的- (BOOL)save:(NSError **)error方法NSManagedObjectContext
于 2010-06-22T20:00:20.803 回答