【发布时间】:2015-05-06 20:07:16
【问题描述】:
假设我有一个可变对象,它有一个可以改变它的函数,并且在某些情况下不应该调用该函数。在这种情况下,我应该如何对调用函数的代码做出反应?
例如:
- 对象:战斗
- 函数:PlayRound()
- 情况:战斗已经有赢家了
- 连续性:战斗将以不一致的状态结束
我能想到两种行为方式,但都觉得不够:
返回一个魔法值,例如
null。这样做的问题是不遵循Fail Faster的思想,使程序处于无效状态。抛出异常。这是我觉得更合适的一个,但如果它已经存在一个可以履行该角色的新
Exception,我想避免创建它。
对于第二种情况,我可以抛出类似ArgumentInvalidException
但我找不到这种情况的等价物。
此方案是否存在等效的现有异常?
注意:我们假设该函数已记录在案,并且明确指出在这种情况下绝不应调用该函数。我仍然认为如果开发人员没有阅读文档,它应该会失败=)
【问题讨论】:
-
你根本不应该抛出异常 - 异常是针对“等等,wha......你是怎么做到的?”而不是“是的,我知道,不是现在……”不确定 Fail-Fast 是否鼓励您使用异常,但我对此表示怀疑……
-
@splite
InvalidOperationException专门为此目的而设计。如果不是例外,那你有什么建议? -
@splite 我不同意。 “当方法调用对对象的当前状态无效时引发的异常”听起来非常适合这种情况。你会怎么做?
-
同意,InvalidOperationException 最适合。 MSDN:“当方法调用对于对象的当前状态无效时引发的异常。”