Guid.Empty应该导致ArgumentException还是ArgumentOutOfRangeException

Mar*_*ann 6 .net oop api

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

public void DoSomething(Guid id)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

adr*_*nks 7

我扔了一个ArgumentException.它的文档说:

提供给方法的其中一个参数无效时引发的异常.

这正是您描述的情景.你想要的东西是:

throw new ArgumentException("Guid.Empty is not a valid id", "id");
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 5

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

这种情况类似于使用ArgumentNullException时的情况,除了空值没有特定的例外.ArgumentNullException会产生误导,因此ArgumentException更适合.

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