假设我有一个方法,它接受某种类型的对象作为参数。现在假设这个方法被传递了一个null参数,这是一个致命的错误,并且应该抛出一个异常。对我来说,编写这样的代码是否值得(请记住,这只是一个微不足道的例子):
void someMethod(SomeClass x)
{
if (x == null){
throw new ArgumentNullException("someMethod received a null argument!");
}
x.doSomething();
}或者当它调用x.doSomething()时,仅仅依靠它抛出NullException对我来说是安全的吗?
其次,假设someMethod是一个构造函数,在调用另一个方法之前不会使用x。我是应该立即抛出异常,还是等到需要x时再抛出异常?
发布于 2008-12-15 15:46:11
与不检查参数的NullReferenceException相比,我更喜欢ArgumentNullException。通常,我倾向于在尝试调用可能为空的对象上的方法之前,始终检查是否为空。
如果方法是一个构造函数,那么它将取决于两个不同的因素:属性是否也有一个公共setter,以及对象被实际使用的可能性有多大。如果有一个公共setter,那么不通过构造函数提供有效的实例将是合理的,并且不应该导致异常。
如果没有公共setter,并且可以在不引用注入对象的情况下使用包含对象,那么您可能希望将检查/异常推迟到尝试使用它。我认为一般情况下,注入的对象对于实例的运行是必不可少的,因此ArgumentNull异常是完全合理的,因为实例没有它就无法运行。
发布于 2008-12-15 15:46:12
我总是遵循fail fast的做法。如果您的方法依赖于X,并且您知道X可能会传入null,那么请检查它并立即引发异常,而不是延长故障点。
2016更新:
真实世界的例子。我强烈推荐使用JetBrains Annotations。
[Pure]
public static object Call([NotNull] Type declaringType,
[NotNull] string methodName,
[CanBeNull] object instance)
{
if (declaringType == null) throw new ArgumentNullException(nameof(declaringType));
if (methodName == null) throw new ArgumentNullException(nameof(methodName));随着C# 6提供了nameof操作符,Guard语句得到了极大的改进。
发布于 2008-12-15 15:46:57
出于以下原因,我更喜欢显式的例外:
https://stackoverflow.com/questions/368742
复制相似问题