2009-09-21 2 views
36

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

+2

Зачем бросать исключение, когда вы можете вернуть результат функции, указывающий на то, что некоторые данные отсутствуют? – Lightman

ответ

48

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

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

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

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

+0

+1 Я согласен на 100 процентов, использую то, что предлагает система, и только тогда, если вы не можете найти что-то, что будет работать, тогда создайте пользовательские исключения. –

+0

Возможным кандидатом также может быть 'ValidationException' –

2

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

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

+3

System.Xml.XmlException используется средой выполнения, чтобы указать ошибку, читающую XML-документ, в частности, где XML не соответствует правильному формату (например, закрытый тег, отсутствующий корневой элемент). Он включает даже номера строк и символов. Мне не очень нравится. –

+0

Если его XML должен иметь данные в узле и не имеет какого-либо ИМО, XML не имеет правильного формата, поэтому он может показать, в какой строке (даже какой номер символа, если он хочет). Я думаю, что это подходит, даже если определение его собственного исключения было бы лучше. –

7

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

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

+0

Задайте сообщение со спецификой. –

-5

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

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

1

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

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

+0

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

12

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

+1

Это часть System.Data.Entity.dll и может создать ненужную зависимость. – Stijn

+4

@Stijn Sure. Вот почему я сказал «вы можете подумать». –

Смежные вопросы