0

假设我有一些陈述,例如:

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””之类的信息,这对于修复错误将非常有用。甚至是字符串格式的完整谓词。我可以以某种方式查看这些信息并显示或记录它吗?

4

3 回答 3

4

如果您确实需要有关谓词及其参数的信息,那么您可以创建自己的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"

于 2012-11-01T14:46:18.693 回答
2

不,抛出的异常 ( InvalidOperationException) 是通用的,不会给出那种细节。堆栈跟踪将开始于Single()并且不显示传入的谓词。

如果您需要该级别的详细信息,您可以在单独的语句中设置属性,以便您可以从堆栈跟踪中获取行号,或者您可以对数据进行“预检查”以确保它符合您的条件独特性。

于 2012-11-01T14:39:54.500 回答
-1
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);
}
于 2012-11-01T14:39:07.380 回答