Какие типы исключений может генерировать метод XmlSerializer.Deserialize? - PullRequest
17 голосов
/ 25 августа 2009

Для этого метода, XmlSerializer.Deserialize, какие исключения могут быть выброшены? XmlException? InvalidOperationException? Я не нашел никакой информации об исключении из этого метода. У меня вопрос, какие исключения могут быть выброшены из этого метода?

http://msdn.microsoft.com/en-us/library/dsh84875.aspx

Я использую VSTS2008 + C # + .Net.

спасибо заранее, George

Ответы [ 3 ]

20 голосов
/ 25 августа 2009

Похоже, в основном InvalidOperationException.

Если вы изучите документацию для каждой из перегрузок, она предоставит вам более подробную информацию. Например, см. XmlSerializer.Deserialize Method (XmlReader)

InvalidOperationException будет содержать более подробную информацию о конкретной ошибке в свойстве InnerException.

Edit:

XmlSerializer.Deserialize Method (XmlSerializationReader) может выдавать NotImplementedException, но это внутренний API и не предназначен для использования вашим кодом, поэтому не беспокойтесь об этом.

Редактировать 2:

Этот код:

var ms = new System.IO.MemoryStream();
var deser = new System.Xml.Serialization.XmlSerializer(typeof(string));
deser.Deserialize(ms);

броски:

System.InvalidOperationException: There is an error in XML document (0, 0). ---
System.Xml.XmlException: Root element is missing.
  at System.Xml.XmlTextReaderImpl.Throw(Exception e)
... <snip> ...

Так что действительно похоже, что фреймворк всегда будет выдавать InvalidOperationException.

Действительно, если вы не беспокоитесь о ошибочной отлове исключений, таких как ThreadAbortException, вы, вероятно, наиболее безопасны при отлове всех исключений ...

Редактировать 3:

Использование Отражатель : метод Deserialize(stream) читает поток с использованием XmlTextReader и вызывает XmlSerializer.Deserialize Method (XmlReader, String). Этот метод выдает InvalidOperationException при ошибке (согласно документации).

Редактировать 4:

Deserialize(stream) также может выдать NullReferenceException, если stream равно нулю, поскольку вызывает конструктор XmlTextReader(Stream).

7 голосов
/ 20 марта 2012

Исключения из XmlSerializer

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

В большинстве случаев, Сериализация, Десериализация и даже XmlSerializer Конструктор сгенерирует довольно общий System.InvalidOperationException когда происходит ошибка. Этот тип исключения может встречаться во многих местах .NET Framework; это вообще не относится к XmlSerializer. к что еще хуже, свойство Message исключения только очень общая информация.

Этот и другие очень полезные советы об исключениях в XmlSerializer можно найти в документе Устранение распространенных проблем с XmlSerializer .

1 голос
/ 25 августа 2009

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

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

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

...