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