想象一下,你有一个带有以下签名的方法:
public void DoSomething(Guid id)
如果Guid.Emtpy
表示非法值,那么最适合抛出哪种异常类型? ArgumentException还是ArgumentOutOfRangeException?
我略微倾向于ArgumentException,因为我不认为除了Guid.Empty 之外的所有Guids都是一个范围 - 它有点过于包容:只有一个被排除的成员。
但是,我绝不认为应该是这种情况,所以我想听听是否有人可以为其中一个提供论据?
我很清楚这主要是一个语义讨论,但为了良好的API设计,我仍然想知道是否存在明确的一个或另一个选项。
答案 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是否正确?