返回 NAN 以指示对同时设置 NSError 的方法的无效输入的危险

Posted

技术标签:

【中文标题】返回 NAN 以指示对同时设置 NSError 的方法的无效输入的危险【英文标题】:dangers of returning NAN to indicate invalid input to a method that also sets NSError 【发布时间】:2015-04-15 11:48:04 【问题描述】:

我正在编写一个基于输入参数返回一个(双)数字的方法。由于某些输入将没有有效的返回值,我希望该方法指示失败,并使用 NSError 提供有关错误的详细信息。 Apple 说(错误处理指南)不要使用返回的 NSError 对象来确定失败,而是让该方法返回 BOOL true 或 false,如果为 false,则检查 NSError 对象。

我计划返回 NAN 以指示失败并检查它以及 NSError 对象,而不是包装类以返回 BOOL 和另一个对象。如果我忘记检查 NAN 然后使用该值,我(认为我)理解明显的问题,但是还有其他不良/邪恶后果吗?代码看起来像这样:

NSError *sphericErr;
double sphericValue= [densityForThickness: mixThickness error:&sphericErr];
if (NAN == sphericValue) 
    // advise user of the error using NSError class messages

感谢所有 cmets。谢谢!

【问题讨论】:

【参考方案1】:

首先,NAN == sphericValue 永远不会是真的。 NaN 与任何数字都不同,包括 NaN。 if (sphericValue != sphericValue) 可以很好地检测 NaN。

您应该返回一个指示错误的值并通过指针传递 NSError* 的原因是 NSError* 指针是可选的。调用者应该能够调用您的方法传递错误:NULL。如果调用者只是传递另一个它从自己的调用者那里收到的 NSError**,这一点尤其重要。因此,您需要除 NSError* 之外的其他方式来指示存在错误。

可以按照您的建议使用返回值,除非您想返回一个 NaN 而不会出错。所以你可能会考虑返回一个 bool,并传递一个 double* 和一个指向 NSError* 的指针。

如果您打开所有警告,编译器很可能会在您执行 Apple真正 不希望您执行的操作时执行此操作。

【讨论】:

非常感谢!正如你所说,if (NAN == sphericValue) 总是返回 false。我从来没有想过要做if (sphericValue!=sphericValue) then...

以上是关于返回 NAN 以指示对同时设置 NSError 的方法的无效输入的危险的主要内容,如果未能解决你的问题,请参考以下文章

matlab SVM 返回 NaN

isNaN+parseFloat进行统计以及对NaN的处理

js中为啥NaN的返回类型为number

无效的 LngLat 对象:(NaN, NaN) - getElementById 不返回值

当所有值都是 NaN 时,Pandas 重新采样以返回 NaN

navigator.geolocation.watchPosition 以速度返回 NaN