检查方法的参数时,如果它为空,我会抛出ArgumentNullException
。请参阅以下方法中的第一行。但是参数的属性不应该是空的呢?如果我尝试以相同的方式处理它们,我会收到代码分析错误:
CA2208正确实例化参数异常方法 ' PriorityDeratingComponentLogic.CreateItem(IvSimulation)'通行证 ' ivSimulation.SolarPanel'作为' paramName'争论一个 ' ArgumentNullException'构造函数。用以下之一替换此参数 方法的参数名称。请注意提供的参数名称 应该具有方法中声明的确切外壳。
public DeratingComponentBase CreateItem(IvSimulation ivSimulation)
{
if (ivSimulation == null) { throw new ArgumentNullException("ivSimulation"); }
if (ivSimulation.SolarPanel == null) { throw new ArgumentNullException("ivSimulation.SolarPanel"); }
if (ivSimulation.GlobalEquipment == null) { throw new ArgumentNullException("ivSimulation.GlobalEquipment"); }
// ... method body here
}
CA错误是我应该抑制的,还是有一种普遍接受的方式来更好地处理这个问题?也许问题是上游问题,我们甚至不应该检查这些属性是否为空?
答案 0 :(得分:5)
投掷ArgumentNullException
旨在表明参数本身为null
。但是,当其中一个参数组件为null
但参数本身不是时,正确的异常为ArgumentException
,参数名称为参数:
if (ivSimulation.GlobalEquipment == null) {
throw new ArgumentException("GlobalEquipment cannot be null", "ivSimulation");
}
这提供了有关消息中错误的信息,同时将ivSimulation
指定为参数名称。
注意:我认为您无法在GlobalEquipment
的构造函数中验证IvSimulation
,因为抛出ArgumentNullException
将是一个非常有效的选择那个构造函数。
答案 1 :(得分:1)
可以认为非null参数变量的null属性实际上不是null参数,因此ArgumentNullException
在这种情况下实际上并不合适。 (显然,其他人可能不同意,这很好。)这对我来说就像一个质的不同的情况。该参数不会丢失,但它处于无效状态。我想我会在这样的情况下使用InvalidOperationException
,其中一个对象处于无效状态。