Исключение для отсутствующих данных - PullRequest
45 голосов
/ 21 сентября 2009

Мне было интересно, какое исключение следует выдать для отсутствующих данных. Например, если узел xml не содержит данных. Было бы легко " выбросить новое исключение (...) ", но это не рекомендуется. Другой вариант - создать новый класс исключений, например MissingDataException или InvalidDataException , но для этого случая нет встроенного класса исключений?

Ответы [ 6 ]

55 голосов
/ 21 сентября 2009

Как правило, проверяйте существующие исключения .NET Framework на наличие подходящего исключения, прежде чем создавать свое собственное. Чтобы ответить на ваш вопрос напрямую, в данный момент нет исключения «отсутствующие данные», которое можно выдать, но это не означает, что нет подходящих исключений для освещения вашей ситуации.

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

Если вы передаете свои XML-данные методу, ArgumentException или одно из его производных может быть подходящим выбором. Существует небольшое семейство этих исключений, все из которых указывают на то, что аргумент, передаваемый методу, не соответствует ожидаемому методу.

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

16 голосов
/ 01 июня 2015

Существует также класс System.Data.ObjectNotFoundException, который вы можете рассмотреть.

Обновление: Начиная с Entity Framework 6, полное имя этого класса исключений: System.Data.Entity.Core.ObjectNotFoundException.

См. этот вопрос для получения дополнительной информации об изменениях пространства имен EF5-> EF6.

8 голосов
/ 21 сентября 2009

Не вызывайте «бросить новое исключение», потому что вы не знаете, как обработать исключение.

Определите свое собственное исключение. Будьте более конкретны, например, XMLDataMissingException. Затем вы можете дать пользователю сообщение или войти в него.

2 голосов
/ 21 сентября 2009

Вы можете использовать System.Xml.XmlException.

Редактировать: даже если System.Xml.XmlException может соответствовать, я думаю, что вы должны определить свое собственное исключение, поскольку оно будет более точным, и вы могли бы описать, какого рода данные отсутствуют: идентификатор, дата и т. Д.

1 голос
/ 28 июня 2012

Как правило, вы должны бросать исключения в исключительных обстоятельствах. Если данные, о которых идет речь, отрицательно влияют на состояние или поведение объекта, выведите пользовательское исключение. Альтернативный подход может включать некоторый тип валидатора, который запускает события, которые ваш клиент корректно обрабатывает, например, сообщает об ошибке конечному пользователю или вставляет значения по умолчанию.

У меня была похожая проблема, которую вы описали, когда у меня было 2 клиента (назовем их A & B), которые читали и модифицировали один XML-файл. Клиент A удалил узел X, затем Клиент B попытался обновить узел X. Очевидно, что обновление узла, который больше не существует, является проблемой. Чтобы решить эту проблему, я воспользовался SQL Server, который сообщает о количестве строк, затронутых оператором UPDATE. В этом конкретном случае я вызывал событие UpdateNode как обычно, при этом для свойства количества затронутых строк было установлено значение 0.

0 голосов
/ 21 сентября 2009

выбрасывать новое исключение («мое сообщение»); (или другое встроенное исключение) часто является правильным подходом. Альтернативой является взрыв классов исключений, которые могут быть использованы только один раз.

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

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