Какие типы исключений можно использовать для метода XmlSerializer.Deserialize?

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

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

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

спасибо заранее, Джордж

Ответы

Ответ 1

Похоже, в первую очередь 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:

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

Изменить 4:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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