Если XmlException.SourceUri доступен только для чтения, что в этом хорошего? - PullRequest
2 голосов
/ 14 мая 2010

У меня есть пара мест в моем коде, где он выбрасывает новое исключение System.Xml.XmlException. Я мог бы просто сделать

throw new XmlException("Your XML sucks go fix it then try again.");  

Но я думаю, что лучше по возможности использовать преимущества членов, относящихся к классу исключений (в противном случае вы могли бы с тем же успехом бросать простой символ Exception каждый раз). SourceUri и LineNumber были бы полезны, но они только имеют get методы, я не могу назначить им значение! Существует только 3 перегрузки конструктора, и ни у одного из них нет параметров для этих элементов; Я могу только инициализировать Message, ничего больше.

Должен быть какой-то способ заполнить эти элементы данных значениями, в противном случае, почему XmlException беспокоит их?

Полагаю, я мог бы создать новый класс, который наследует XmlException, и написать новый конструктор, который инициализирует SourceUri и т. Д., Но, тем не менее, должен быть способ просто использовать XmlException. Правильно?

Ответы [ 3 ]

2 голосов
/ 14 мая 2010

Там - это конструктор с номером строки и положением строки . Я не вижу ничего, что берет SourceUri, хотя ...

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

Я думаю, что лучше всего рассматривать это как нечто, что эффективно предоставляется только системными XmlExceptions. Я не думаю, что это делает его бесполезным - просто менее гибким, чем могло бы быть. (Я подозреваю, что подавляющее большинство исключений XmlException в мире генерируется системой, а не кодом пользователя.)

1 голос
/ 14 мая 2010

Существует конструктор, который принимает параметр sourceUri:

internal XmlException(string res, string[] args, string sourceUri)

Но поскольку он является внутренним, его можно вызывать только внутри сборки System.Xml. Во всяком случае, я не думаю, что вы должны бросить XmlException самостоятельно. Это исключение обычно генерируется связанными с XML классами BCL. Вам лучше создать свое собственное исключение и вместо него выдать его.

0 голосов
/ 14 мая 2010

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

...