区分相同类型的异常,例如用 Enumerable.Single()
Differentiating between the same type of Exceptions, e.g. with Enumerable.Single()
考虑以下代码:
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),
这不是 "exceptional" 因为正如你所说,一个人可能不存在。所以当这种情况发生时我们不应该抛出异常。这就像访问网站并搜索产品。如果没有结果 returned 那可能不是错误。这只是意味着他们不销售该产品。
or more than 1 result are returned (which means something is seriously wrong assuming ID is supposed to be unique).
如果不可能得到不止一个结果,那么不止一个结果应该抛出异常。
这使得 SingleOrDefault
成为最佳选择。检查空值,因为查询可能没有 return 任何内容。但是,如果发生了完全越界的事情,那么应该有一个例外。
考虑以下代码:
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),
这不是 "exceptional" 因为正如你所说,一个人可能不存在。所以当这种情况发生时我们不应该抛出异常。这就像访问网站并搜索产品。如果没有结果 returned 那可能不是错误。这只是意味着他们不销售该产品。
or more than 1 result are returned (which means something is seriously wrong assuming ID is supposed to be unique).
如果不可能得到不止一个结果,那么不止一个结果应该抛出异常。
这使得 SingleOrDefault
成为最佳选择。检查空值,因为查询可能没有 return 任何内容。但是,如果发生了完全越界的事情,那么应该有一个例外。