请考虑以下代码:
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?
答案 0 :(得分:3)
答案在这里:
返回0结果(这可能不会太惊人, 人只是不存在),
这不是特殊的"因为正如你所说,一个人可能不存在。因此,当发生这种情况时,我们不应该抛出异常。这就像去网站搜索产品一样。如果没有返回结果,则可能不是错误。这只意味着他们不会销售该产品。
返回或多于1个结果(假设ID应该是唯一的,这意味着严重错误)。
如果不可能获得多个结果,那么多个结果应该抛出异常。
这使SingleOrDefault
成为最佳选择。检查null,因为查询可能不返回任何内容。但如果发生了一些完全超出界限的事情,那么就应该有例外。