例如,如果您将汽车传递给使用应该检查空引用的汽车的子汽车?
我是否应该在下面的if语句中包含此代码?这似乎是多余的,显然我可以给出一个更好的例子,因为我无法捕获异常并以任何方式处理它。
或者我应该让异常泡到呼叫者那里?
例如:
Public Sub CarService(ByVal car As ICar)
If car IsNot Nothing Then
'do logic here
Else : Throw New ArgumentNullException
End If
End Sub
答案 0 :(得分:4)
自己投掷NullReferenceException
实际上毫无意义。因为这是
null
)和但是,至少对于公共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秒)。