【问题标题】:The exception instead of NullReferenceException to throw?抛出异常而不是 NullReferenceException?
【发布时间】:2017-04-01 21:06:15
【问题描述】:

c#代码

void method(int a)
{
    int b = get(a);
    if ( b == 0 )
    {
        throw new NullReferenceException();
    }
}

如果我抛出NullReferenceException,它会产生一个警告,这不是一个好办法。

那么如果有任何异常而不是 NullReferenceException 呢?我找到了 ArgumentNullException,但它对这段代码不太合适,因为 b 不是参数。

【问题讨论】:

  • 例外的选择主要是个人喜好 - 所以这可能不适合 SO。
  • @AlexeiLevenkov 如果我使用 ArgumentNullException,那么参数 is 必须是“a”,否则会产生另一个警告,但我希望记录 b 为空。
  • 为什么要生成异常?我会使用bool method(int a)return truereturn false 否则你可以看看这篇文章:msdn.microsoft.com/en-us/library/87cdya3t(v=vs.110).aspx
  • 如果您觉得异常是正确的方法,为什么不创建自己的异常类,例如public class GetFailureException: Exception。您只需要覆盖类中的标准构造函数。
  • @JohnD,你的建议很好,但我不会创建我的例外,因为他们不会签署我的代码:p。我搜索项目代码发现他们使用 ArgumentException 来处理这件事。非常感谢!

标签: c# exception null nullreferenceexception argumentnullexception


【解决方案1】:

在这种情况下,如果函数 get(a) 是确定性的,我建议抛出 ArgumentException 并说明 a 的允许范围。

即throw new ArgumentException("参数 a 必须是 ....", "a");

如果函数 get(a) 是不确定的(我们不能说什么是可接受的范围),那么 ApplicationException 会显示一些关于原因的消息(即“无法执行操作,因为此时服务器很忙”)。

【讨论】:

    【解决方案2】:

    正如@AlexeiLevenkov 在他的评论中所说,选择异常类型取决于个人选择。但是,您应该遵守一些准则。例如,就像您看到的那样,不要从代码中抛出 NullReferenceException

    MSDN 提供了一些非常合理的指导方针,正如您所料。

    关于您的实际问题,如果自定义异常不合适,我可能会使用InvalidOperationException。 YMMV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多