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