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

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

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

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

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


person Vilx-    schedule 18.12.2009    source источник


Ответы (5)


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

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

person Nicole Calinoiu    schedule 18.12.2009
comment
@Vilx: Хороший вопрос ... Вы обнаруживаете проблему цикличности при чтении содержимого XML (т. Е. Вы бы использовали проверку по схеме, если бы могли) или когда вы строите результирующий граф объектов на основе ранее считанные данные? - person Nicole Calinoiu; 18.12.2009
comment
В настоящее время - когда я строю граф объектов. В противном случае я не подтверждаю это (хотя, вероятно, это не повредит). Также есть много вещей, которые можно проверить только на финальном этапе строительства объекта. Идея состоит в том, что XML описывает виды объектов, которые могут быть основаны на шаблонах, которые, в свою очередь, могут быть основаны на других шаблонах и т. д. И есть требование, чтобы конечный объект имел свойство X, но он мог бы исходить из какого-то шаблона. вверх по течению. Вы не можете проверить это ни с какой схемой, это просто неразумно. - person Vilx-; 18.12.2009
comment
Принял ваш ответ, потому что это то, что я использовал. ИнвалидДатаИсключение. :) - person Vilx-; 18.12.2009
comment
Поскольку ваше исключение возникает на этапе построения, а не на этапе проверки, другим кандидатом может быть InvalidOperationException (см. msdn.microsoft.com/en-us/library/ms229007.aspx для получения рекомендаций по использованию). Это был бы особенно хороший выбор, если циклический граф теоретически подходит, даже если ваш код не может его обработать. - person Nicole Calinoiu; 18.12.2009

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

Возможно, CyclicGraphFoundException?

person Oded    schedule 18.12.2009

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

Если у вас возникла проблема с потоковой передачей JPEG, рассмотрите FileFormatException.

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

person Gregory Pakosz    schedule 18.12.2009
comment
ApplicationException устарело (вроде): msdn.microsoft.com/en- мы/библиотека/ - person Christian Klauser; 18.12.2009
comment
да, как вы говорите, я быстро набрал код в MSVC2005, и, поскольку он собирается без предупреждений, я не понял, они советуют больше не использовать ApplicationException, хотя они не помечали его как устаревший - person Gregory Pakosz; 18.12.2009
comment
Не использование ApplicationException устарело, но MS предлагает не создавать собственные классы исключений из ApplicationException, лучше напрямую из System.Exception. - person Doc Brown; 18.12.2009
comment
действительно, это то, что говорит ссылка, предоставленная @SealedSun - person Gregory Pakosz; 18.12.2009

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

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

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

person João Angelo    schedule 18.12.2009

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

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

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

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

person Joe    schedule 18.12.2009