对于这种方法XmlSerializer.Deserialize
,可能抛出什么类型的异常? XmlException
? InvalidOperationException
?我没有从这个方法中找到任何异常描述信息。我的问题是这种方法可以抛出什么样的异常?
http://msdn.microsoft.com/en-us/library/dsh84875.aspx
我使用的是VSTS2008 + C#+ .Net。
提前谢谢, 乔治答案 0 :(得分:20)
主要看起来像InvalidOperationException
。
如果您查看每个重载的文档,它将为您提供更多详细信息。例如,请参阅XmlSerializer.Deserialize Method (XmlReader)
InvalidOperationException
将包含有关其InnerException
属性中特定错误的更多详细信息。
编辑:
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
,因为它会调用XmlTextReader(Stream)
构造函数。
答案 1 :(得分:7)
XmlSerializer的例外
首先,诊断这些问题的根源可能很棘手, 因为XmlSerializer的例外似乎没有提供 关于其发生原因的大量信息;至少,他们 不要在开发人员通常的位置提供信息 看起来。
在大多数情况下,Serialize,Deserialize甚至是XmlSerializer 构造函数抛出一个相当通用的
System.InvalidOperationException
发生错误时此异常类型可能出现在许多地方 .NET Framework;它根本不是特定于XmlSerializer的。至 更糟糕的是,异常的Message属性只会产生很大的影响 通用信息。
可以在文档Troubleshooting Common Problems with the XmlSerializer上找到关于XmlSerializer中的异常的这个以及其他非常方便的提示。
答案 2 :(得分:1)
George,因为.NET中没有异常契约,最好的做法是捕获您可能想要进行特殊处理的任何特定异常,但也要有一个能够适当处理所有失败的全能异常处理程序。
我已经使用内置的.NET序列化实现了几个XML序列化解决方案,并且在所有情况下都使用了catch-all except块,它解决了捕获异常的不足之处,添加了所有错误消息和异常类类型到一个字符串消息。这样做总能提供足够的信息来调试任何序列化问题。
在相关的说明中,我通常做的是添加一个调试日志级别,它将完整的xml记录到我的应用程序的日志中,以便我可以检查它以尝试找出在调试冻结问题时出错的地方。< / p>