Какие типы исключений можно использовать для метода 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 в моем журнале приложений, чтобы я мог проверить его, чтобы попытаться выяснить, что не так при отладке проблемы с сериализации.