簡體   English   中英

有什么方法可以在LINQ中捕獲導致異常的謂詞?

[英]Is there any way to catch predicate in LINQ that caused exception?

說我有一些聲明,例如:

List<string> list = new List<string> {"1", "1", "2", "3", "4"};
try
{
    Class1 c = new Class1
        {
            s1 = list.Single(s => s == "1"),
            s2 = list.Single(s => s == "2"),
            s3 = list.Single(s => s == "3"),
            s4 = list.Single(s => s == "4")
        };
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);
}

我肯定會在以下行出現錯誤“輸入序列包含多個元素”,從而進入catch塊:

s1 = list.Single(s => s == "1")

因此,我只是好奇,有什么方法可以在catch塊中顯示錯誤謂詞嗎? 如果我們看到類似“順序有重復的元素“ 1””的信息,這對於修復錯誤將非常有用。 甚至是字符串格式的完整謂詞。 我可以某種方式查看此信息並顯示或記錄嗎?

如果您確實需要有關謂詞及其參數的信息,則可以創建自己的Single擴展方法(將調用它而不是默認方法),該方法實際上將包裝默認的Single調用,但它將接收Expression (表示樹的表達式) lambda表達式)代替Func (lambda表達式):

public static T Single<T>(this IEnumerable<T> sequence, 
                          Expression<Func<T, bool>> predicate)
{
    try
    {
        return sequence.Single(predicate.Compile());
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine("Error on predicate " + predicate);
        throw;
    }            
}

在行s1 = list.Single(s => s == "1") ,它將引發異常並寫入錯誤消息:

Error on predicate s => s == "1"

不,拋出的異常( InvalidOperationException )是通用的,不會提供此類詳細信息。 堆棧跟蹤將從Single()開始,不顯示傳入的謂詞。

如果需要該級別的詳細信息,則可以在單獨的語句中設置屬性,以便可以從堆棧跟蹤中獲取行號,或者可以對數據進行“預檢查”以確保其滿足您的條件。獨特之處。

List<string> list = new List<string> {"1", "1", "2", "3", "4"};
string sValue=null;
try
{
    sValue="1";
    Class1 c = new Class1
    {
       s1 = list.Single(s => s == sValue),

    };
}
catch (InvalidOperationException ex)
{
    Console.WriteLine("s => s == "+ sValue);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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