[英]LINQ query which converts XML document to object list causing exception
我有一個很大的LINQ查詢,它將XML節點讀入對象屬性,但是查詢中的一行正在基於“輸入字符串格式不正確”導致System.FormatException異常。
DeliveryFee = x.Descendants("LineItemShipping").Select(e => (double)e.Element("TotalPrice")).FirstOrDefault(),
(double)e.Element(“ TotalPrice”)//調試器突出顯示該行中的此文本,因此該元素必須是原因
XML文檔中有1000條記錄,所以我很難找到導致異常的記錄,有沒有辦法我可以將引起錯誤的值“扔”給catch()語句? 我不確定如何調試LINQ查詢以在運行時獲取值,我確定這只是該特定記錄的XML節點為空的問題。 (或包含非法字符)
我知道這是一條特定的記錄,因為我可以拉很多行而沒有問題,但是當我嘗試拉出發生異常的特定子集時,所以我知道它已本地化為一個月的數據,但無法縮小它的范圍下降更多。
要找到此錯誤,請首先通過Debug
> Exceptions
在Visual Studio中引發異常時啟用中斷 。 要么啟用對所有異常的中斷,要么啟用對System.FormatException
中斷。
現在,當為LineItemShipping
節點拋出異常並帶有無效的TotalPrice
時,Visual Studio將停止。 然后,在立即窗口中 ,可以使用AncestorsAndSelf()
方法通過鍵入以下內容來查找有問題的節點:
e.Element("SomeStatus").AncestorsAndSelf().ToArray()
Visual Studio將向您顯示生成異常的XElement
的路徑。 這應該使您能夠找到有問題的XML節點。
您可以將try catch語句添加到select表達式中,如下所示:
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();
嘗試將(double)
更改為(double?)
以處理空情況和?? 0
?? 0
將null轉換為零:
(double)(x.Descendants("LineItemShipping")
.Select(e => (double?)e.Element("TotalPrice")).FirstOrDefault())
?? 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.