我有一个非常大的LINQ查询,它将XML节点读入对象属性,但是我的查询中的一行导致System.FormatException异常基于"输入字符串格式不正确"。
DeliveryFee = x.Descendants("LineItemShipping").Select(e => (double)e.Element("TotalPrice")).FirstOrDefault(),
(double)e.Element(" TotalPrice")//行中的这个文本由调试器突出显示,因此该元素必须是原因
XML文档中有1000条记录,因此我无法找到导致异常的记录,有没有办法可以"抛出"导致错误的值到catch()语句?我不确定如何调试LINQ查询以在运行时获取值,并且我确定它只是该XML节点对于此特定记录为空的问题。 (或包含非法字符)
我知道它是一个特定的记录,因为我可以在没有问题的情况下拉出很多行但是当我尝试拉出一个特定的子集时,我得到异常,所以我知道它本地化为几个月值得的数据,但我无法缩小它的范围。
答案 0 :(得分:2)
要发现此错误,请首先通过Debug
启用breaking when an exception is thrown in visual studio - > Exceptions
。要么打开所有例外,要么启用System.FormatException
上的中断。
现在,当LineItemShipping
节点出现无效TotalPrice
的异常时,Visual Studio将停止。然后,在immediate window中,您可以使用AncestorsAndSelf()
方法通过键入以下内容来查找有问题的节点:
e.Element("SomeStatus").AncestorsAndSelf().ToArray()
Visual Studio将向您显示生成异常的XElement
的路径。这应该允许您找到有问题的XML节点。
答案 1 :(得分:1)
您可以在select表达式中添加try catch语句,如下所示:
var DeliveryFee = x.Descendants("LineItemShipping").
Select(e => {
try
{
var item = (double)e.Element("TotalPrice");
return item;
}
catch(Exception ex)
{
//This is just so it will compile and have a return value
return double.MinValue;
}
}).
FirstOrDefault();
答案 2 :(得分:0)
尝试将(double)
更改为(double?)
以处理空案例,并尝试将?? 0
更改为将空值转换为零:
(double)(x.Descendants("LineItemShipping")
.Select(e => (double?)e.Element("TotalPrice")).FirstOrDefault())
?? 0)