如何正确处理iPhone上的错误

The*_*ebe 5 iphone error-handling exception-handling objective-c

我有一个关于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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助,迈克尔

aro*_*oth 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];
Run Code Online (Sandbox Code Playgroud)

  • 这个答案在两个重要细节上是错误的;你**不能**将异常重的代码翻译成Objective-C并希望获得相同的行为**除非**该代码根本不调用系统框架。其次,“if (error)”*总是错误的*;一旦你检查了“success”为假,“error”*必须*被设置(如果没有设置,你就在你调用的代码中发现了一个错误)。 (2认同)