当其他东西需要返回值时,指示 ObjC 调用中的错误情况

Posted

技术标签:

【中文标题】当其他东西需要返回值时,指示 ObjC 调用中的错误情况【英文标题】:Indicate an error condition in an ObjC call when return value is needed for something else 【发布时间】:2017-06-21 16:29:04 【问题描述】:

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

说得更清楚一点,我的返回值已经分开了,用来表示方法是否完成了某项任务,在程序流的时候便于代码的可读性。例如,如果你实现:

-(bool) didFinishTest;

你可以继续写:

if ([Student didFinishTest])

   // ... do something

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

我当然可以想办法解决这个问题,但我在这里向社区提出的问题是,有没有最好的或推荐的方法,如果有,是什么?

【问题讨论】:

【参考方案1】:

您可以添加对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 指针以指向描述问题的错误对象。

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

【讨论】:

Tiko,在我的问题中,我提到了 Apple 如何推荐您在特定情况下描述的返回值是免费的(未使用)。当返回值已被用于其他用途时,我正在寻找解决方案。 这种情况下返回值是免费的,你可以返回任何你想要的,这个方法返回BOOL,但是你可以返回任何你想要的类型,例如AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error ];返回AVCaptureDeviceInput类型的对象【参考方案2】:

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

【讨论】:

我赞成你的答案,因为它非常简洁,但我认为 Tiko 的答案是正确的,因为他(勉强)击败了你。 一般NSError**参数应该是可选参数;传入NULL意味着“我只想知道成功/失败,不要费心计算为什么。”。 @bbum - 我同意,“一般”,但是当返回值没有空间表明失败时,要求参数不是NULL是一个合理的例外,它证明了这个规则。

以上是关于当其他东西需要返回值时,指示 ObjC 调用中的错误情况的主要内容,如果未能解决你的问题,请参考以下文章

当 ms 访问中的 MsgBox 函数在 vbYesno 中返回 -1 值时

当 xlCoerce 返回一个值时,它会再次计算单元格中的公式吗?

当给出其他两个值时,有没有办法计算像素的颜色分量(如绿色)的值?

当数据库为表中的一列返回空值时如何处理错误

当使用AJAX从flask中返回值时,它说[Object, Object]。

mysql coalesce函数