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

dangers of returning NAN to indicate invalid input to a method that also sets NSError

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

我计划 returning NAN 来指示失败并检查它以及 NSError 对象,而不是将 class 包装到 return 一个 BOOL 和另一个目的。如果我忘记检查 NAN 然后使用该值,我(认为我)明白这个明显的问题,但是还有其他 bad/evil 后果吗?代码看起来像这样:

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

感谢所有评论。谢谢!

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

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

可以 按照您的建议使用 return 值,除非您想要 return 一个 NaN 而不是错误。所以你可能会考虑 returning 一个 bool,然后传递一个 double* 和一个指向 NSError* 的指针。

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