当其他内容需要返回值时,在ObjC调用中指示错误条件

时间:2017-06-21 16:29:05

标签: objective-c methods exception-handling return-value nserror

当需要返回值来指示成功或失败时,Objective-C中指示错误情况的正确方法是什么?

为了更清楚,我的返回值已经被分开以指示该方法是否完成某个任务,并且当涉及程序流时它对于代码可读性是很方便的。例如,如果您实现:

-(bool) didFinishTest;

你可以继续写:

if ([Student didFinishTest])
{
   // ... do something
}

但是当然在执行该方法时可能会发生某种故障。在我的应用程序的Android版本中,我只是在实现中发生意外故障时抛出自定义异常。然而,Apple文档似乎不鼓励在生产代码中使用它。然而,在Apple建议使用NSError时,他们建议使用返回值来指示是否存在失败,NSError对象传达有关错误的信息。在上面的示例中,这将阻止我使用返回值来指示学生是否完成了测试。

我当然可以找到解决这个问题的方法,但我在这里向社区提出的问题是,是否有最佳或推荐的方式,如果是这样的话,那么它是什么?

2 个答案:

答案 0 :(得分:4)

您可以添加对NSError指针的引用,以添加失败描述。

Apple "Programming With Objective-C" guide says

  

一些Cocoa和Cocoa Touch API通过引用传回错误。 [...]

- (BOOL)writeToURL:(NSURL *)aURL
       options:(NSDataWritingOptions)mask
         error:(NSError **)errorPtr;
     

在调用此方法之前,您需要创建一个合适的指针,以便传递其地址:

 NSError *anyError;
 BOOL success = [receivedData writeToURL:someLocalFileURL
                                 options:0
                                   error:&anyError];
 if (!success) {
     NSLog(@"Write failed with error: %@", anyError);
     // present error to user
 }

如果发生错误,writeToURL:...方法将返回NO,并更新anyError指针以指向描述问题的错误对象。

  

在处理通过引用传递的错误时,测试很重要   方法的返回值,以查看是否发生错误,如   如上所示。不要只是测试是否设置了错误指针   指出错误。

答案 1 :(得分:1)

在被调用的方法中,成功时将返回的NSError设置为nil,并在失败时设置为错误对象。在调用者测试中,错误返回nil。 HTH