c# - 区分相同类型的异常,例如与 Enumerable.Single()

标签 c# exception 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 的唯一选择?

最佳答案

答案在这里:

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/

相关文章:

python - Try-Except-Else-Finally 返回 else 替代方案?

c# - EF4 在保存更改之前看不到上下文更改

c# - 抛出可忽略的异常

c# - 需要帮助理解 IEnumerable 中的 C# yield

ios - "Auto Layout still required..."返回主视图 Controller 时崩溃

c# - 尝试获取在 Linq2Entities 查询中连接的字符串

entity-framework - Entity Framework + 有条件附加的 Where() 子句

c# - 使用 Linq to Entities 查询创建 null ienumerable

c# - 添加线程到线程数组

c# - 检测文件扩展名 c#