Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>>
Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>>
我对出色的 language-ext c# 库很陌生。
我有这样的代码 returns 一个 Try<IEnumerable<Try<Unit>>
对象:
Try(DetectAlertsToNotify)
.MapT(SendNotification)
//treat errors happened indifferently from their source
编辑:DetectAlertsToNotify returns AlertDTO 的 IEnumerable
我想要实现的是优雅地处理所有异常,或者可能是 DetectAlertsToNotify 或 SendNotification 中发生的第一个异常。
如何汇总所有错误或找出 Try<IEnumerable<Try<Unit>>
的第一个错误,同时尽可能保持代码简单和最少?
也许您正在寻找这样的东西:
using LanguageExt;
using static LanguageExt.Prelude;
Try<Unit> Send(string message)
{
return Try(unit);
}
Try<Arr<string>> GetList()
{
return Try(Array("a", "b", "c"));
}
// LINQ style (better for longer chains)
var errorOrAllResults1 =
from inputs in GetList()
from results in inputs.Map(Send).Sequence()
select results;
// method style
var errorOrAllResults2 = GetList().Bind(inputs => inputs.Map(Send).Sequence());
备注:
- 我使用
Arr<T>
而不是 IEnumerable<T>
因为这可以确保在 Try
之外没有枚举,以防枚举时可能引发异常。否则我们可能需要一些助手来确保枚举本身在某些 Try
. 中被捕获
Sequence()
将更改内部和外部 monad(容器)。这会将 Arr<Try<Unit>>
变成 Try<Arr<Unit>>
。我们需要这个,因为我们 want/need “停留”在 Try
monad(LINQ 表达式)中。
如果您查看中间类型,您可能会明白这一点。
我对出色的 language-ext c# 库很陌生。
我有这样的代码 returns 一个 Try<IEnumerable<Try<Unit>>
对象:
Try(DetectAlertsToNotify)
.MapT(SendNotification)
//treat errors happened indifferently from their source
编辑:DetectAlertsToNotify returns AlertDTO 的 IEnumerable
我想要实现的是优雅地处理所有异常,或者可能是 DetectAlertsToNotify 或 SendNotification 中发生的第一个异常。
如何汇总所有错误或找出 Try<IEnumerable<Try<Unit>>
的第一个错误,同时尽可能保持代码简单和最少?
也许您正在寻找这样的东西:
using LanguageExt;
using static LanguageExt.Prelude;
Try<Unit> Send(string message)
{
return Try(unit);
}
Try<Arr<string>> GetList()
{
return Try(Array("a", "b", "c"));
}
// LINQ style (better for longer chains)
var errorOrAllResults1 =
from inputs in GetList()
from results in inputs.Map(Send).Sequence()
select results;
// method style
var errorOrAllResults2 = GetList().Bind(inputs => inputs.Map(Send).Sequence());
备注:
- 我使用
Arr<T>
而不是IEnumerable<T>
因为这可以确保在Try
之外没有枚举,以防枚举时可能引发异常。否则我们可能需要一些助手来确保枚举本身在某些Try
. 中被捕获
Sequence()
将更改内部和外部 monad(容器)。这会将Arr<Try<Unit>>
变成Try<Arr<Unit>>
。我们需要这个,因为我们 want/need “停留”在Try
monad(LINQ 表达式)中。
如果您查看中间类型,您可能会明白这一点。