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

问题描述:

当需要返回值指示成功或失败时,Objective-C中指示错误条件的正确方法是什么?当需要返回值作为其他值时,在ObjC调用中指示错误条件

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

-(bool) didFinishTest; 

你可以去写:

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

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

我当然可以设法解决这个问题,但是我对这里的社区提出的问题是,是否有最好的或推荐的方法来解决这个问题?如果是的话,它是什么?

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

Apple "Programming With Objective-C" guide says

Some Cocoa and Cocoa Touch API pass back errors by reference. [...]

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

Before you call this method, you’ll need to create a suitable pointer so that you can pass its address:

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指针指向描述该问题的错误对象。

When dealing with errors passed by reference, it’s important to test the return value of the method to see whether an error occurred, as shown above. Don’t just test to see whether the error pointer was set to point to an error.

+0

Tiko,在我的问题中,我提到了Apple如何推荐您在特定情况下描述的返回值是免费的(未使用)。我正在寻找一个解决方案,当返回值已被用于其他的东西。 – Alyoshak

+0

在这种情况下返回值是免费的,你可以返回任何你想要的,这个方法返回BOOL,但是你可以返回任何你想要的类型,例如'AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];'返回 AVCaptureDeviceInput类型的对象 – Tiko

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

+0

我提高了你的答案,因为它是如此简洁,但我相信Tiko正确的答案BC他击败你(几乎)的一拳。 – Alyoshak

+0

通常,'NSError **'参数应该是一个可选参数;传递NULL意味着“我只想知道成功/失败,不要打算计算原因。” – bbum

+0

@bbum - 我同意,“一般”,但是当返回值没有空间来指示失败时,*要求*参数不是'NULL'是证明规则的合理例外。 – CRD