Какое исключение должно быть выдано программой .NET, если она обнаруживает недействительные данные? - PullRequest
3 голосов
/ 18 декабря 2009

Рассмотрим следующий пример: как часть конфигурации для моей программы пользователь предоставляет файл XML, который по сути должен описывать ациклический граф, но моя программа находит график при его загрузке. Это критическая ошибка, программа не может продолжаться. Какое исключение следует выбросить?

Другие примеры включают в себя попытку загрузки файла в каком-то определенном формате (скажем, JPEG), но при этом встречается ошибка; или получение данных по сети из другой сторонней программы, которая должна быть правильной, но не является.

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

(Примечание. Это не должно быть аргументом XXX Исключение, поскольку эти данные не передаются в качестве параметра методу).

Ответы [ 5 ]

3 голосов
/ 18 декабря 2009

По крайней мере для некоторых из ваших сценариев System.IO.InvalidDataException подойдет.

Для XML-файла наилучшим подходом, вероятно, является проверка по заранее определенной схеме, и в этом случае будет выдано подтверждение System.Xml.Schema.XmlSchemaValidationException.

3 голосов
/ 18 декабря 2009

Создайте свое собственное исключение - я не верю, что в BCL есть класс исключений, который точно описывает этот сценарий.

Возможно, CyclicGraphFoundException?

1 голос
/ 18 декабря 2009

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

Для решения проблемы потоковой передачи JPEG рассмотрим FileFormatException.

Я бы сказал, что лучше получить столько классов исключений, сколько необходимо для точного моделирования возникшей ситуации, по сравнению со сложением всего в один общий (слишком общий ?!) класс исключений и иметь только сообщение, чтобы различать эти ситуации .

0 голосов
/ 18 декабря 2009

Я бы следовал инструкциям MSDN по выявлению и обработке ошибок , в частности

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

В вашем первом случае, когда файл является частью конфигурации вашего приложения, я бы предположил, что вы не ожидаете, что пользователи поймут и обработают это конкретное исключение, поэтому я бы использовал предопределенный ConfigurationErrorsException.

В других случаях я бы также попытался использовать предопределенное исключение, если только вы не ожидаете, что клиентам придется обрабатывать это исключение по-другому. .NET 3.5 FileFormatException, как предлагают другие, кажется хорошим выбором. Вы также можете использовать (злоупотреблять?) Такой тип, как System.Data.DataException, даже если его документация действительно не соответствует вашей ситуации. Или пользовательский тип исключения, если вас это не устраивает, но в любом случае запишите типы исключений, которые вы выбрасываете, и обстоятельства, при которых вы их выбрасываете, и я уверен, что ваши пользователи будут счастливы.

0 голосов
/ 18 декабря 2009

Вы должны рассмотреть пользовательское исключение, или вы также можете использовать FileFormatException.

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

FileFormatException доступно только в .NET 3.5, 3.0 и требует ссылки на WindowsBase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...