0

我使用以下代码从 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;          
}

我知道 rethrow 它是多余的部分,但我想以可控的方式抛出它。我想用这个地方向用户展示某些 XML 文件已损坏(即标签未关闭)。一切正常,直到我不离开班级并且我想从请求此数据的班级中捕获此异常。似乎异常被忽略并以某种方式绕过,应用程序突然跳转到不同的方法。为什么我无法捕捉到这个异常?我什至创建了自己的异常,但结果是一样的 - 似乎它只是没有离开原始类并导致一些应用程序跳转。

4

3 回答 3

1

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

于 2013-06-18T11:47:06.420 回答
1

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

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

于 2013-06-18T11:26:06.137 回答
0

您可以使用 XSD 来验证这一点,这是我知道进行这种验证的唯一动态方法,此链接可以提供帮助

于 2013-06-18T11:39:09.507 回答