繁体   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