Guid.Empty应该导致ArgumentException还是ArgumentOutOfRangeException

时间:2009-06-22 11:39:00

标签: .net api oop

想象一下,你有一个带有以下签名的方法:

public void DoSomething(Guid id)

如果Guid.Emtpy表示非法值,那么最适合抛出哪种异常类型? ArgumentException还是ArgumentOutOfRangeException?

我略微倾向于ArgumentException,因为我不认为除了Guid.Empty 之外的所有Guids都是一个范围 - 它有点过于包容:只有一个被排除的成员。

但是,我绝不认为应该是这种情况,所以我想听听是否有人可以为其中一个提供论据?

我很清楚这主要是一个语义讨论,但为了良好的API设计,我仍然想知道是否存在明确的一个或另一个选项。

4 个答案:

答案 0 :(得分:7)

我扔了ArgumentException。其docs说:

  

当提供给方法的其中一个参数无效时抛出的异常。

这正是您描述的场景。你想要的东西:

throw new ArgumentException("Guid.Empty is not a valid id", "id");

答案 1 :(得分:5)

说空值超出范围似乎是错误的。由于Guid.Empty通常在没有定义值时使用,因此实际上没有任何值可以超出范围。

情况类似于使用ArgumentNullException时,除了空值没有特定的异常。一个ArgumentNullException会产生误导,所以ArgumentException更合适。

还要考虑ApplicationException是否会更好。这用于应用程序中的异常而不是类库。

答案 2 :(得分:1)

抛出 Invalid ArgumentException。这完全遵循你所追求的语义。如果您期望ArgumentOutOfRangeException并且uint以外的所有值都有效,则不会抛出0xffffffff,是吗?

答案 3 :(得分:0)

AE

你的方法所期望的Guids的可接受范围究竟是什么?

CA72EE5A-5F26-11DE-BD28-13A156D89593是否在可接受的范围内,但D58B3112-5F26-11DE-B0D2-5FA156D89593是否正确?