2009-09-14 3 views
11

У меня есть метод, который принимает имя файла как параметр, все имена файлов должны заканчиваться на «.csv». Какое исключение я должен использовать, если имя файла, которое не заканчивается на .csv, передается?Какое исключение должно быть выбрано для недопустимого имени файла?

Или я должен использовать другой подход?

+0

Что происходит, если пользователь имеет файл '* .txt' в формате с разделителями-запятыми? Для произвольного приложения ожидаемое поведение * в этом случае позволяет явно выбирать файл через фильтр «Все файлы» в «FileDialog» или полный ввод имени файла с расширением. –

ответ

14

ArgumentOutOfRangeException - То, что вы описываете в соответствии с вне исключением диапазона.?:

Исключение, которое вызывается, когда значение значения arg ument находится за пределами допустимого диапазона значений , как определено методом invoked.

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"); 
+0

+1, согласовано - как документация для состояний ArgumentException', «Первичные производные классы« ArgumentException »- это« ArgumentNullException »и« ArgumentOutOfRangeException ». Эти производные классы следует использовать вместо« ArgumentException », за исключением ситуаций, когда ни один из них допустимых производных классов ». –

10

ArgumentException подходит для счета IMO.

8

Я бы, вероятно, использовать ArgumentException, так как это «Исключение, которое генерируется, когда один из аргументов, предоставленных метод не является действительным»

1

System.ArgumentException представляется целесообразным, либо непосредственно, либо в качестве базового класса для вашего исключения ,

5

Проверьте документацию существующего метода ввода-вывода в Framework. Он описывает исключения, сгенерированные методом. Например, отметьте 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, как описано в документации, Путь пустой строки (""). "

См Choosing the Right Type of Exception to Throw на http://msdn.microsoft.com/en-us/library/ms229021.aspx

+0

Это хороший момент. Я не слишком доволен тем, как это работает с инфраструктурой, но если вы хотите быть совместимым с классами Stream, это может быть хорошей идеей сделать это (предполагая, что рассматриваемый метод действительно связан с IO). –

+0

Согласовано, но после Я привык к исключениям IO, я не против этого. Одно из преимуществ исключения ArgumentException, как определено, позволит легко отлаживать, когда имя файла действительно «». – AMissico

+1

Нет, неправильное (но действительное) расширение не является IOExcpetion. Это нарушенное ограничение на этом уровне. –

1

Как насчет создания ваших собственных InvalidFilenameException Например:

public class InvalidFilenameException : Exception 
{ 
    public string Filename { get; private set; } 

    public InvalidFilenameException(string message, string invalidFilename) 
     :base(message) 
    { 
     Filename = invalidFilename; 
    } 
} 
+1

Чем больше кода вы пишете, тем больше возможностей для ошибок, тем больше времени требуется, тем больше решений необходимо принять. Если нет особой необходимости в специальном исключении, лучше избегать их. – AMissico

+0

Ну, конечно. Но если я нахожу более ясным создание собственного Исключения, если вы не можете найти никого, кто действительно подходит. Как и предполагаемое исключение IOException. Это действительно исключение IOException? Я бы, вероятно, использовал ArgumentException, предложенный другими здесь. Но просто подумал, что я могу предложить альтернативу. – Svish

+0

Правда. Хенк Холтерман делает хороший момент. Трудно сделать предложение, потому что вопрос расплывчатый. Вот почему я пытаюсь заставить разработчика взглянуть на существующую документацию для руководства. – AMissico

Смежные вопросы