用于空值的正当例外

Ken*_*130 3 c# exception-handling

在以下示例中,我们有两个不同的异常要通信.

//constructor
public Main(string arg){
   if(arg==null)
      throw new ArgumentNullException("arg");

  Thing foo=GetFoo(arg);

  if(foo==null)
     throw new NullReferenceException("foo is null");    
}
Run Code Online (Sandbox Code Playgroud)

这是两种异常类型的正确方法吗?

Jon*_*eet 6

第一个例外肯定是正确的.这是第二个棘手的问题.

这里有两种可能性:

  • GetFoo()并不意味着返回null.在那种情况下,我们基本上证明了一个错误GetFoo().我不确定这里最好的例外,将ContractException(从代码合同中)留在一边.基本上你想要的东西就像ContractException-个例外,这意味着"世界已经疯了:这不只是外部意想不到的结果,有一个错误在这里."
  • GetFoo()null由于arg价值,可以合法地返回.在这种情况下,我建议ArgumentException(但不是 ArgumentNullException)可能是合适的.另一方面,使用参数ArgumentException 抛出是奇怪的.

InvalidOperationException在这里不太合适,但我可能会试图将它作为最接近合同失败的东西......

编辑:根据Aaronaught的回答,您还应该考虑创建自己的例外.


SLa*_*aks 5

你永远不应该明确抛出一个NullReferenceException.

如果null作为参数传递,则应该ArgumentNullException使用参数的名称抛出一个.
如果是其他的事情null,你应该抛出InvalidOperationException描述性的消息.