【问题标题】:Should Guid.Empty Result in ArgumentException or ArgumentOutOfRangeExceptionGuid.Empty 应该导致 ArgumentException 或 ArgumentOutOfRangeException
【发布时间】:2010-11-04 19:56:28
【问题描述】:

假设您有一个具有以下签名的方法:

public void DoSomething(Guid id)

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

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

但是,我绝不会确定应该是这种情况,所以我想知道是否有人可以为其中一个或另一个提供论据?

我很清楚这主要是语义讨论,但为了良好的 API 设计,我仍然想知道其中一个选项是否有明确的案例。

【问题讨论】:

  • 这几乎就像你的方法需要某种良好的指导指南。
  • 也许定义你自己的 ArgumentEmptyException?
  • @Justice。不建议为您永远不想捕获它的场景添加新的异常类型。 Mark 应该只抛出现有的异常类型之一。

标签: .net api oop


【解决方案1】:

抛出 InvalidArgumentException。这完全符合您所追求的语义。如果您期望 uint 并且除 0xffffffff 之外的所有值都有效,您不会抛出 ArgumentOutOfRangeException,对吗?

【讨论】:

  • InvalidArgumentException 是 Microsoft.SqlServer.Management.Common 命名空间的一部分。您不想添加引用只是为了访问该异常。请改用 ArgumentException,它位于 System 命名空间中。
  • 你是绝对正确的。我可以发誓我在直接 BCL 代码中看到了一些 InvalidArgumentException,因为我从未使用过 SqlServer...
【解决方案2】:

我会抛出一个ArgumentException。它的docs 说:

当提供给方法的参数之一无效时引发的异常。

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

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

【讨论】:

    【解决方案3】:

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

    情况与使用 ArgumentNullException 时类似,只是没有针对空值的特定异常。 ArgumentNullException 会产生误导,因此 ArgumentException 更合适。

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

    【讨论】:

    • ApplicationException 有点多余,最好避免 (stackoverflow.com/questions/52753/…)。
    • @adrianbansk:这是关于从 Exception 类派生的,这几乎没有关系。如果您不想使用特定的系统异常以便可以将其与其他系统异常一起捕获,那么 ApplicationException 就可以正常工作。
    • 是的,我知道。我的意思是,如果 ApplicationException 被许多人视为“不应该成为 .Net 框架的一部分”,那么它的使用将来可能会被弃用。现在避免将其用于更相关的 ArgumentException 将在以后避免此问题。
    • 抛出 ApplicationException 总是错误的做法。请阅读这篇文章:cuttingedge.it/blogs/steven/pivot/entry.php?id=56。除此之外,Mark 正在检查方法参数,因此他应该抛出 ArgumentException 或其后代之一。
    【解决方案4】:

    AE。

    您的方法所期望的 Guid 的可接受范围究竟是多少?

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

    【讨论】:

    • 我认为可接受的范围是 00000000-0000-0000-0000-000000000001 到 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF。因此,我认为我们可以得出结论,Mark 应该抛出 ArgumentOutOfRangeException,因为只有一个值是无效的。他应该抛出一个 InvalidSingleArgumentValueException,但因为这个异常不存在,我会选择 ArgumentException :-)
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多