如何捕获Deserialize方法抛出的InvalidOperationException

时间:2013-06-18 11:18:51

标签: c# exception serialization xmlserializer invalidoperationexception

我使用以下代码从XML中读取数据

var temp = default(T);
var serializer = new XmlSerializer(typeof(T));

try
{
    TextReader textReader = new StreamReader(fileName);
    temp = (T)serializer.Deserialize(textReader);
}
catch (InvalidOperationException ioe)
{
    throw;          
}

我知道这是多余的部分,但我想以控制的方式抛出它。我想使用这个地方向用户显示某些XML文件已被破坏(即标记未关闭)。一切正常,直到我不离开类,我想从请求此数据的类中捕获此异常。似乎异常是missinig并以某种方式绕过,并且应用程序突然跳入不同的方法。为什么我不能抓住这个例外?我甚至创建了自己的异常,但结果是一样的 - 它似乎不会离开原始类并导致一些应用程序跳转。

3 个答案:

答案 0 :(得分:1)

xml反序列化异常与任何其他异常一样工作 - 没有意外(除了比检查.InnerException(递归)更重要之外,因为所有有趣的信息都嵌套了一些例外向下)。

这可能仅仅是因为你正在捕捉错误的异常吗?例如,不能保证它是InvalidOperationException。只要调用方法的try带有catch(Exception ex),它就应该捕获反序列化期间发生的任何异常。

答案 1 :(得分:1)

我找到了原因。抛出该异常的方法由静态类构造函数调用。这就是为什么没有抛出异常的原因。静态构造函数在开始时被调用,它们只是不抛出异常(是吗?)。我通过从xonstructor中提取方法并通过manualy调用它来改变原始代码 - 现在我可以在上面的层中捕获异常。

答案 2 :(得分:0)

您可以使用XSD验证,我知道进行此类验证的唯一动态方式,Link可以提供帮助