5

我是 Objective-C 的新手,并试图弄清楚维护类的 rep 不变量的最佳方法是什么,因为异常并不是真正执行它们的适当方式。出现这种情况的一个很好的例子是在 Kochan 的Objective-C 编程中Fraction作为示例的类中,它具有这个 setter 方法:

-(void) setDenominator: (int) d {
    self.denominator = d;
}

所以说你的代表不变要求的一部分self.denominator != 0。例如,在 Java 中,强制执行该不变量的最直接方法是抛出一个IllegalArgumentExceptionif 0 被传递,但在 Objective-C 中这没有意义。另一种方法是添加一个NSError**指针参数来报告问题,但这似乎既是矫枉过正,又不适合抽象的性质——与数据库连接不同,我们不期望零分母分数在正常使用中出现。那么这里最干净的解决方案是什么?返回一个整数错误代码?还有什么我想念的吗?

4

4 回答 4

2

看看这个答案

在 Cocoa 和 iOS 程序员中,异常用于指示不可恢复的程序员错误。当框架抛出异常时,它表明框架检测到一个错误状态,该状态既不可恢复,而且内部状态现在未定义。

在这种情况下,这显然是一个非法的不可恢复状态,会导致除以零,因此提出例外是完全合法的

具体来说,您可以NSInvalidArgumentException按照其他人的建议提出 a 。

如果您想更深入地了解该主题,您应该查看错误处理编程指南

于 2012-12-06T23:16:59.110 回答
2

你可以使用NSAssert()

- (void)setDenominator:(int)d
{
    NSAssert(d != 0, @"denominator cannot be 0");
    self.denominator = d;
}
于 2012-12-06T23:02:48.040 回答
1

我不明白为什么你认为例外在这里是不合适的。除非有任何额外的限制,否则我只会提出 NSInvalidArgumentException。

于 2012-12-06T23:05:57.770 回答
1

您可以引发NSInvalidArgumentException异常和/或放置一个NSAssert,后者将导致程序以调试模式退出,这很好,因此如果您滥用 api,您可以在开发中捕获它。

[[NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil] raise];

于 2012-12-06T23:06:13.233 回答