作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我被扔进了一个现有的代码库,部分工作是在我进行更新时让代码逐渐接受测试。所以这是一个将旧的和丑陋的东西变得更好的过程。
在这种情况下,有一段类似这样的代码:
foreach (var thingamajigLocator in thingamajigLocators)
{
Thingamajig thingamajig;
try
{
thingamajig = thingamajigservice.GetThingamajig(thingamajigLocator);
}
catch
{
// exception logged further down, but is rethrown
continue;
}
thingamajigCollection.Add(thingamajig);
}
这很丑陋,理论上,如果异常被进一步向下处理,就没有必要在这里处理它,但代码就是这样,目前,处理服务代码的工作量太大了。
我很想做这样的事情:
thingamajigCollection = thingamajigLocators
.Select(tl => thingamajigservice.GetThingamajig(tl))
.Where( /* some condition that strips out the ones throwing exceptions */ );
这有可能吗?还有其他建议吗?我当然可以将 foreach 与 try/catch 一起保留,但它似乎可以更优雅,因为我不关心在这种情况下实际的异常是什么。同样,我知道这是一种可怕的形式,需要加以解决,但现在没有时间。
最佳答案
其实并没有什么区别。 Func 只是一个代表。所以,你可以让它变得非常简单:
thingamajigCollection = thingamajigLocators
.Select(tl =>
{
try
{
return thingamajigservice.GetThingamajig(tl);
}
catch(Exception)
{
return null;
}
})
.Where(t1 => t1!=null);
作为一个选项,您可以将 GetThingamajig 包装在新方法中以在那里捕获异常。
注意:正如 hmemcpy 所说,吞噬异常并不是最好的方法。所以,你最好尝试重新设计。
关于c# - 有没有办法只返回不使用 LINQ 抛出异常的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3914131/
我是一名优秀的程序员,十分优秀!