当其他东西需要返回值时,指示 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 返回一个值时,它会再次计算单元格中的公式吗?
当给出其他两个值时,有没有办法计算像素的颜色分量(如绿色)的值?