【发布时间】:2010-11-28 03:20:51
【问题描述】:
我有一个接受文件名作为参数的方法,所有文件名都应以“.csv”结尾。如果传递了不以 .csv 结尾的文件名,我应该抛出哪个异常?
或者我应该采取不同的方法吗?
【问题讨论】:
-
如果用户有一个逗号分隔值格式的
*.txt文件会发生什么?对于任意应用程序,这种情况下的预期行为是允许通过FileDialog中的“所有文件”过滤器或带扩展名的完整文件名输入显式选择文件。
我有一个接受文件名作为参数的方法,所有文件名都应以“.csv”结尾。如果传递了不以 .csv 结尾的文件名,我应该抛出哪个异常?
或者我应该采取不同的方法吗?
【问题讨论】:
*.txt 文件会发生什么?对于任意应用程序,这种情况下的预期行为是允许通过FileDialog 中的“所有文件”过滤器或带扩展名的完整文件名输入显式选择文件。
ArgumentOutOfRangeException - 您所描述的内容符合超出范围的异常:
执行时抛出的异常 参数的值在 定义的允许值范围 通过调用的方法。
ArgumentException 用于验证路径字符串中的字符,而不是文件类型。
路径参数是零长度 字符串,仅包含空格,或 包含一个或多个无效 字符。
恕我直言,路径验证失败图表如下所示:
如果这对您来说描述性不够,请创建您自己的异常类:
public class InvalidFileTypeException : System.IO.IOException
{
public InvalidFileTypeException(string path, string acceptedTypeMask)
{
this.Message = string.Format(
"File type '{0}' does not fall within the expected range: '{1}'",
path,
acceptedTypeMask);
}
}
...
throw new InvalidFileTypeException("foo.txt", "*.csv");
【讨论】:
ArgumentException 的文档所述,“ArgumentException 的主要派生类是 ArgumentNullException 和 ArgumentOutOfRangeException。应该使用这些派生类而不是 @987654336 @,除非派生类都不可接受。"
ArgumentException 符合 IMO 的要求。
【讨论】:
我可能会使用ArgumentException,因为它是“当提供给方法的参数之一无效时引发的异常”
【讨论】:
查看框架中现有 IO 方法的文档。它描述了一个方法产生的异常。例如,检查StreamWriter.StreamWriter(String, Boolean, Encoding, Int32) Constructor http://msdn.microsoft.com/en-us/library/0wf7ab94(VS.85).aspx。为了保持一致,我建议您使用的异常是 IOException。然后,您可以添加描述详细信息的自定义消息。
IOException - 路径包含不正确或无效的文件名、目录名或卷标语法语法。
在你的情况下,文件扩展名不正确,所以告诉用户,如Throw New IOException("Invalid file extension.")。
我会按照文档中的说明保留 ArgumentException,path 是一个空字符串 ("")。"
请参阅Choosing the Right Type of Exception to Throwhttp://msdn.microsoft.com/en-us/library/ms229021.aspx。
【讨论】:
System.ArgumentException 看起来很合适,可以直接使用,也可以作为异常的基类。
【讨论】:
创建自己的InvalidFilenameException 怎么样?例如:
public class InvalidFilenameException : Exception
{
public string Filename { get; private set; }
public InvalidFilenameException(string message, string invalidFilename)
:base(message)
{
Filename = invalidFilename;
}
}
【讨论】: