C#:我应该抛出ArgumentException还是DirectoryNotFoundException?

时间:2009-07-02 07:50:03

标签: c# exception

我有一个将目录路径作为字符串的方法。在方法的开头,它检查此路径是否存在,如果不存在,则应该抛出异常。我认为它应该抛出DirectoryNotFoundException或其他东西而不是特定的ArgumentException

我阅读了DirectoryNotFoundException的msdn文档,并说明了

  

DirectoryNotFoundException使用值为HRESULT COR_E_DIRECTORYNOTFOUND的{​​{1}}。

我不知道究竟是什么意思,它看起来有点可怕......我是否仍然会抛出异常,或者我应该坚持常规0x80070003?或者我应该坚持ArgumentException只是因为这是我抱怨的争论?或?

ArgumentException

5 个答案:

答案 0 :(得分:16)

如果您希望开发人员在调用方法之前检查目录是否存在,请使用ArgumentException。如果您希望开发人员可以选择处理丢失的目录,请使用DirectoryNotFound异常。

换句话说,开发人员告诉我访问不存在的目录是“ bug 吗?”

就个人而言,我会使用DirectoryNotFound异常。

答案 1 :(得分:2)

在我看来,你应该检查参数的正确性并抛出一个ArgumentException然后在check之后抛出一个DirectoryNotFoundException。 如果没有给出参数或者只指定了错误的路径,那么这是一个很大的区别。

void CheckDir(string path)
{
  if(String.IsNullOrEmpty(path))
  {
    throw new ArgumentException("Path not specified.");
  }
   if(!Directory.Exists(path))
  {
    throw new DirectoryNotFoundException();
  }
}

答案 2 :(得分:1)

这只是我的观点(因为我没有具体的支持),但是我的理由 for 抛出DirectoryNotFoundException而不是ArgumentException:

  • 您应该抛出最具体/准确的异常类型,以便允许代码的使用者理解抛出异常的原因。
  • 假设当您尝试使用不存在的目录而不是ArgumentException执行某些操作时,Framework方法将抛出DirectoryNotFoundException,请遵循框架的bejaviour

答案 3 :(得分:1)

听起来你应该抛出一个DirectoryNotFoundException,因为如果没有提供指定的参数,ArgumentException会被更好地使用....它的空白。

另一个选择是创建你自己的例外并抛出它,即。

[Serializable]
public class InvalidConfigurationException: Exception
{
    public InvalidConfigurationException() : base()
    {
    }

    public InvalidConfigurationException(string message)
        : base(message)
    {
    }

    public InvalidConfigurationException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected InvalidConfigurationException(SerializationInfo info, StreamingContext context) 
        : base(info, context) 
    { 
    }
}

然后你可以这样做:

public void MakeFunOf(string path)
{    
   if(!Directory.Exists(path))        
       throw new InvalidConfigurationException('Directory entered was invalid or does not exist');
   TellJokeAbout(path);    
   PointAndLaughAt(path);
}

答案 4 :(得分:0)

参考“ArgumentException”的文档:

  调用方法并且至少有一个传递的参数不符合被调用方法的参数规范时,抛出

ArgumentException。   ArgumentException的所有实例都应带有描述无效参数的有意义的错误消息,以及参数的预期值范围。

对于这封信,这意味着异常选择取决于您的方法的规范/文档。

如果路径参数被记录为类似'现有文件/目录的路径'那么你就有理由抛出'ArgumentException'(或衍生物),因为基本上是凭借您使调用者负责确保文件实际存在的文档。

如果路径参数更一般地记录为'一个文件的路径来开玩笑并嘲笑',那么我会说'DirectoryNotFoundException'更合适。