如何应对Linq查询中的异常?

时间:2011-02-18 01:17:32

标签: linq exception

我发现在查询列表时使用Linq是一种有用的体验,并提供了简洁易读的代码。

我发现的问题是,当发生错误时,很难调试查询的哪一部分失败。

有没有办法找到这个?它只是突出显示整个查询并返回错误。

一个例子是如果我有一个列表:

class Person
{
    public IList<string> Pets
    {
        // please, don't do this at home :)
        get { throw new InvalidOperationException(); }
    }
}

Person person = new Person();

List<Person> myStrings = new List<Person>();
myStrings.Add(person);

var people = from p in myStrings
             where p.Pets.Count > 0
             select p;

显然,检查null是一个简单的解决方案,但对于更复杂的错误(也可能不那么明显),我们应该如何找到查询失败的位置?

是否有Linq探查器或什么?

2 个答案:

答案 0 :(得分:4)

您可以将Visual Studio设置为中断所有异常,并在lambda中抛出异常后立即中断。

这也可以发现微妙的错误;我高度推荐它 但是,对于旧的,带有异常的代码,这将是一场噩梦。

答案 1 :(得分:-1)

Person person = new Person();
person.Pets = null;

List<Person> myStrings = new List<Person>();
myStrings.Add(person);

var people = from p in myStrings
             let pets = p.Pets
             where pets != null && pets.Count > 0
             select p;

如果人们认为这不重复,我很抱歉。它是。

问题始终是打破你的表达,寻找你没有提前考虑的空的东西。与任何其他复杂表达式一样,问题与LINQ查询和lambda表达式没有什么不同。将它分解,将碎片放在不同的行上,然后确切地找到它所在的行。


在Visual Studio 2010中这不太难:

enter image description here