考虑以下代码:
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 的唯一选择?
最佳答案
答案在这里:
Either 0 results are returned (which might not be too alarming, the person just doesn't exist),
这并不是“异常(exception)”,因为正如你所说,一个人可能不存在。所以当这种情况发生时我们不应该抛出异常。这就像访问网站并搜索产品一样。如果没有返回结果,则可能不是错误。这只是意味着他们不销售该产品。
or more than 1 result are returned (which means something is seriously wrong assuming ID is supposed to be unique).
如果不可能获得多个结果,则多个结果应该抛出异常。
这使得 SingleOrDefault
成为最佳选择。检查是否为 null,因为查询可能不会返回任何内容。但如果发生完全超出界限的事情,那么应该有异常(exception)。
关于c# - 区分相同类型的异常,例如与 Enumerable.Single(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510118/