0

我有一个代表三角形的模型对象。有一些 init 方法采用不同的已知参数组合。然后它求解剩余的值(边长和角度)。目前,如果给定参数为 nil 或超出此三角形类型的适当范围,我的初始化程序将返回 nil。然而,为了向用户提供适当的反馈,控制器对象还必须检查不正确的输入值,例如角度 > 90 度等。这对我来说很臭,因为这些规则应该在模型中定义一次。所以我的想法是有一个 NSError 对象被设置为控制器应该向用户显示的字符串。我只是不确定将其传达给控制器的最佳方式。如果发生错误,我的 init 方法是否应该返回此 NSError 而不是 Triangle 实例?这似乎是错误的。或者我是否将一个指向 NSError 对象的指针作为参数传递给 init,并在发生错误时填充它?如果我这样做,我是否仍然从三角形对象的 init 返回 nil,因为它不可用,或者我只是部分初始化三角形并返回它?

4

2 回答 2

2

您应该遵循其他 Cocoa 对象使用的相同约定,如 Apple 的错误处理编程指南中所述:

  • 添加一个参数,该参数将 anNSError**作为方法的最后一个参数。
  • 发生错误时,如果该参数不是NULL,则使用对象填充它NSError并返回nil
  • 对于init方法,您还应该[self release]在返回之前nil(除非您使用 ARC)。
于 2012-06-04T00:56:53.990 回答
1

如果您想要详细的错误消息,请执行以下任一操作:

  1. 抛出异常。这正是他们的目的。

  2. 提供只验证输入的方法,例如

+ (NSError *)errorFromValidationOfSide:(float)a size:(float)b;

在创建对象之前调用它。这样,您可以在内部共享任何验证代码,而不是在对象之外复制它。

正如您所怀疑的,让您的init方法返回除正确类型的工作对象之外的任何内容是一个坏主意。在 init 上使用 NSError 指针是可以的,但对我来说似乎有点笨拙。

于 2012-06-04T00:56:38.157 回答