@codecity

.Net Неверный формат аргумента функции: ArgumentException или FormatException?

Сначала приведу официальное описание исключений согласно MSDN. Приведу на русском, чтобы всем было понятно:

1. ArgumentException

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

2. FormatException

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


Как видно из официальной документации — оба исключения должны возникать только из-за некорректного значения аргумента, переданного в метод. Т.к. FormatException не наследуется от ArgumentException — многие люди полагают, что в официальной документации ошибка (уже 10 лет никто не удосужился исправить).


Какой же есть четкий критерий когда какое из этих двух исключений выбрасывать? Вот, к примеру,

FileInfo fileInfo = new FileInfo("*"); // ArgumentException



и

Uri uri = new Uri("*"); // UriFormatException



или даже

WebRequest.Create("*"); // UriFormatException


Какие же есть единые стандарты по выбрасыванию ArgumentException|FormatException, чтобы не возникало путаницы?


Спасибо за внимание!
  • Вопрос задан
  • 2724 просмотра
Пригласить эксперта
Ответы на вопрос 1
VenomBlood
@VenomBlood
На мой взгляд форматные исключения возникают в строках или при явной передаче объекта который может иметь несколько «форматов» представления (хотя в этом случае лучше реализовать конвертер по возможности и не выкидывать эксепшены вообще).
Если мы передали вообще неверные данные — ArgumentException, если передали верные данные, но в неверном формате — FormatException. Только здесь надо определять уже в контексте конкретного приложения, могут ли входные данные быть вообще неверными (имея один формат представления) или все данные верны, но из за разных форматов может возникнуть ошибка. Например при формировании даты из строки для строки типа «dfdfdsfsf» я бы выдавал исключение неверного формата, а для данных «32.09.2010» — ошибку неверного аргумента (генериться оно будет соотв. уже на более низком уровне, при проверке даты).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы