谁负责检查空参考例外?

时间:2012-11-09 07:42:40

标签: c# vb.net coding-style

例如,如果您将汽车传递给使用应该检查空引用的汽车的子汽车?

我是否应该在下面的if语句中包含此代码?这似乎是多余的,显然我可以给出一个更好的例子,因为我无法捕获异常并以任何方式处理它。

或者我应该让异常泡到呼​​叫者那里?

例如:

Public Sub CarService(ByVal car As ICar)
    If car IsNot Nothing Then
        'do logic here 
    Else : Throw New ArgumentNullException
    End If
End Sub

5 个答案:

答案 0 :(得分:4)

自己投掷NullReferenceException实际上毫无意义。因为这是

  1. 与CLR相同的异常(至少在你的时候) 访问您手动检查null)和
  2. 的相同引用 无论如何,
  3. 是气馁的。见备注 here。有关相关讨论,请参阅Is it necessary to throw a NullReferenceException from an extension method?
  4. 但是,至少对于公共API表面,您应该检查空引用并抛出ArgumentNullException

    Public Sub CarService(ByVal car As ICar)
        If car Is Nothing Then
            Throw New ArgumentNullException("car")
        End If
        ' do logic here
    End Sub
    

    或者查看Code Contracts

答案 1 :(得分:1)

我认为这是一个好主意,因为您可以防止代码无法预测。由于异常取决于以下代码,因此可以随之更改。使用您的代码,您可以知道可以抛出的异常位置和异常。

你唯一应该考虑的是你应该使用什么例外,甚至创建一个自己的例外。因为NullReference似乎有点错位。

答案 2 :(得分:1)

我想这取决于场景。有些情况null是传递给方法的有效值。如果不是,那么您需要权衡在代码到达null对象之前会出现多少逻辑。如果在那之前没有任何重要的事情发生,那么你可以简单地让它冒出来。如果您在使用该对象之前确实进行了重要操作,那么在您输入方法时,它是值得检查的。此外,如果您有多个对象,则调用者将不知道哪个对象导致了该问题,因此您可能自己抛出异常,添加正确的错误消息。

答案 3 :(得分:1)

由你决定。

如果NULL是您逻辑的一部分,然后在您的CarService方法中处理它。例如,在您的代码中,NULL汽车可能意味着它是一辆未知的汽车,在这种情况下,您必须为其编写逻辑。

如果你不应该传递NULL,你应该抛出异常。 这样边缘大小写将在调用方处理。例如,如果您的代码执行类似的操作:

Public Sub CarService(ByVal car As ICar)
    car.ToString();
End Sub

在这种情况下,明确地抛出错误是有意义的,这将在整个框架中保持一致。

答案 4 :(得分:1)

在我看来,自己抛出NullReferenceException是无稽之谈(CLR会为你做这件事)。但另一方面,抛出ArgumentNullException对我来说是一个很好的做法。如果发生错误,您确切地知道问题的位置以及哪个参数不能为空。 为了节省写这种不断重复的代码的时间,我在ReSharper中使用宏(没问题,不到2秒)。