簡體   English   中英

LINQ查詢將XML文檔轉換為導致異常的對象列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM