gpt4 book ai didi

c# - 让 Single 和 SingleOrDefault 抛出更简洁的异常

转载 作者:太空狗 更新时间:2023-10-29 23:07:12 24 4
gpt4 key购买 nike

调用时SingleSingleOrDefaultIEnumerable<T> 上, 它有多个结果,它抛出 InvalidOperationException .

虽然异常的实际消息非常具有描述性,但编写一个只处理 Single 的情况的 catch 是有问题的。/SingleOrDefault调用失败。

public virtual Fee GetFeeByPromoCode(string promoCode)
{
try
{
return _fees.SingleOrDefault(f => f.IsPromoCodeValid(promoCode));
}
catch (InvalidOperationException)
{
throw new TooManyFeesException();
}
}

在这种情况下,如果 IsPromoCodeValid还会抛出 InvalidOperationException ,那么对于 catch 正在处理的内容就变得模棱两可了。

可以检查异常消息,但我想避免这种情况,因为我发现根据异常消息处理代码很脏。

我目前对 SingleOrDefault 的替代看起来像下面这样:

public virtual Fee GetFeeByPromoCode(string promoCode)
{
var fees = _fees.Where(f => f.IsPromoCodeValid(promoCode)).ToList();

if (fees.Count > 1)
{
throw new InvalidFeeSetupException();
}

return fees.FirstOrDefault();
}

然而,这段代码没有上面的代码那么明显,此外,与使用 SingleOrDefault 相比,它生成的查询效率较低(如果使用支持 linq 的 ORM) .

我也可以做 Take(2)用我的第二个例子来优化它一点,但这进一步混淆了代码的意图。

有没有办法在不为 IEnumerable 编写我自己的扩展的情况下做到这一点?和 IQueryable

最佳答案

这可以解决问题吗?

public virtual Fee GetFeeByPromoCode(string promoCode)
{
try
{
return _fees.SingleOrDefault(f =>
{
try
{
return f.IsPromoCodeValid(promoCode);
}
catch(InvalidOperationException)
{
throw new PromoCodeException();
}
});
}
catch (InvalidOperationException)
{
throw new TooManyFeesException();
}
}

关于c# - 让 Single 和 SingleOrDefault 抛出更简洁的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com