区分相同类型的例外,例如与Enumerable.Single()

时间:2016-07-21 16:54:28

标签: c# exception-handling linq-to-entities

请考虑以下代码:

int myId = 10;

try
{
    var me = this.Db.People.Single(p => p.Id = myId);
}
catch(InvalidOperationException e)
{
    // Either I don't exist ("Sequence contains no elements"),
    // or more than one of me exists ("Sequence contains more than one element")
}

有两个条件:返回0结果(可能不会太惊人,人不存在),或者返回超过1个结果(这意味着假设ID应该是严重错误的唯一的)。

理想情况下,我想捕获并处理异常,如果它被抛出,因为0结果被返回,但是如果它被抛出则不会捕获异常,因为返回了多个结果(我无法处理这种情况,但是我不想简单地忽略那些非常错误的事情。)

有没有办法区分这两个异常,所以我只能处理返回0结果的情况,或者是我唯一选择使用SingleOrDefault并检查null?

1 个答案:

答案 0 :(得分:3)

答案在这里:

  

返回0结果(这可能不会太惊人,   人只是不存在),

这不是特殊的"因为正如你所说,一个人可能不存在。因此,当发生这种情况时,我们不应该抛出异常。这就像去网站搜索产品​​一样。如果没有返回结果,则可能不是错误。这只意味着他们不会销售该产品。

  返回

或多于1个结果(假设ID应该是唯一的,这意味着严重错误)。

如果不可能获得多个结果,那么多个结果应该抛出异常。

这使SingleOrDefault成为最佳选择。检查null,因为查询可能不返回任何内容。但如果发生了一些完全超出界限的事情,那么就应该有例外。