Какое исключение должно быть выбрано для недопустимого имени файла?

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

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

Ответ 1

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

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

ArgumentException используется для проверки символов в строке пути, а не типа файла.

Параметр path является нулевой длиной строка, содержит только пробел или содержит один или несколько недопустимых символы.

IMHO диаграмма прокрутки проверки пути выглядит следующим образом:

Если этого недостаточно для описания, создайте свой собственный класс исключения:

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

Ответ 2

ArgumentException будет соответствовать счету IMO.

Ответ 3

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

Ответ 4

Проверьте документацию существующего метода ввода-вывода в Framework. Он описывает исключения, сгенерированные методом. Например, Конструктор StreamWriter.StreamWriter(String, Boolean, Encoding, Int32) в http://msdn.microsoft.com/en-us/library/0wf7ab94(VS.85).aspx. Исключение, которое я предлагаю вам использовать, чтобы оставаться последовательным, IOException. Затем вы можете добавить специальное сообщение, которое описывает данные.

IOException - путь содержит неправильный или недействительный синтаксис для имени файла, имени каталога или синтаксиса метки тома.

В вашем случае расширение файла неверно, поэтому сообщите об этом пользователю, как в Throw New IOException("Invalid file extension.").

Я бы оставил ArgumentException, как описано в документации, путь - пустая строка ("").

См. Выбор правильного типа исключения для броска в http://msdn.microsoft.com/en-us/library/ms229021.aspx.

Ответ 5

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

Ответ 6

Как просто создать свой собственный InvalidFilenameException? Например:

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

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