如何正确处理iPhone上的错误

时间:2011-05-10 12:40:59

标签: iphone objective-c exception-handling error-handling

我对iPhone上的错误/异常处理有疑问。

我已经阅读了有关Exception的文档,似乎异常只能用于特殊情况。

这是否意味着你不能像在java中那样使用它们?

例如,我正在尝试为我的应用程序编写一个用例控制器。我在以前使用该语言的项目中有一些Java示例,在出现错误时使用异常。

简单的问题是:我可以按照我在Java中使用的示例,并在Objective-C中“翻译”它(并使用Objective-C异常)或者有更好的方法吗?

这里是我想使客观c友好的代码:

public void addPerformance(Perfomance perf) {
        //do some preparation
            ...
    //execute the usecase
        executor(new AddPerformance(perf));
}

    private void executor(Usecase usecase) {

            try {
                UnitOfWorkServices.INSTANCE.bizTransactionStart();
                usecase.execute();
UnitOfWorkServices.INSTANCE.bizTransactionCommit();
            } catch (RealException re) {
                UnitOfWorkServices.INSTANCE.bizTransactionEscape();
                throw re;
            } catch (Exception e) {
                UnitOfWorkServices.INSTANCE.bizTransactionEscape();
                throw new FatalException(this.getClass().getName() + " / executor("
                        + usecase.getClass().getSimpleName() + ")", e,
                        "APPXCP_006_UNEXPECTED_EXCEPTION",
                        "\n\t |*| : Unexpected exception translated into FatalException");
            } finally {
                UnitOfWorkServices.INSTANCE.bizTransactionEnd();
            }
        }

所有异常都是由UI捕获以显示错误消息。

感谢您的帮助, 迈克尔

2 个答案:

答案 0 :(得分:3)

通常,是的,您可以将您的try / catch逻辑转换为Objective-C中的类似构造,并获得可比较的结果。虽然请谨慎使用throw re;行,因为iPhone上的未捕获异常会导致您的应用崩溃。

更重要的是,iPhone SDK和其他常用库使用的标准模式是,不是抛出异常,而是由于各种原因可能失败的API方法返回一个布尔值,指示操作是否是成功,并接受作为参数的对NSError指针的引用,该指针在发生错误时用于向调用者提供有关错误的具体详细信息。因此,在这种情况下,您的代码可能会转换为更像:

NSError* error = nil;
[[UnitOfWorkServices sharedInstance] bizTransactionStart];
bool success = [usecase execute:&error];
if (success) {
    [[UnitOfWorkServices sharedInstance] bizTransactionCommit];
}
else if (error) {
    int code = [error code];
    [[UnitOfWorkServices sharedInstance] bizTransactionEscape];
    if (code == MY_MINOR_ERROR_CODE) {
        //do something
    }
    else if (code == MY_FATAL_ERROR_CODE) {
        //do something else
    }
    else {
        //handle unexpected error type(s)
    }
}
else {
    //operation failed with no specific error details
    [[UnitOfWorkServices sharedInstance] bizTransactionEscape];
    //handle generic error
}
[[UnitOfWorkServices sharedInstance] bizTransactionEnd];

答案 1 :(得分:1)

您可以像在Java中使用异常一样使用异常,但这不是推荐的方法。将Java转换为Objective-C的方式是有效的,大多数人都会理解你的意图。但结果将与使用字典将英语翻译成德语一样糟糕;拼写是完美的,但语法和语境是完全错误的。

了解处理错误和异常的“Cocoa方式”将帮助您创建更强大的iOS应用程序,并让您更好地了解如何使用官方和第三方API:s。

我在这里写了一篇关于这个主题的更长篇博文:http://blog.jayway.com/2010/10/13/exceptions-and-errors-on-ios/

让我们回顾一下重要的部分:

异常只应用于编程错误,以及无法从中恢复的致命错误。例如,越界异常,如果您第一次使用错误的参数调用应用程序出错,则重试100次将无法修复您的应用,只会继续失败。例外情况是例外到普通工作流程,并帮助您在将应用程序发送给最终用户之前修复所有错误

NSError实例是您用于由用户引起的错误以及应用程序可以从中恢复的内容的实例。例如,IO错误,用户可能想要重新连接到网络,尝试新密码,然后再试一次。这是针对您可以预测的错误,以及应用程序或用户可以执行的操作。