Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败

Posted

技术标签:

【中文标题】Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败【英文标题】:Language-ext Aggregate exceptions/failures when Try<IEnumerable<Try<...>>> 【发布时间】:2021-08-15 03:28:37 【问题描述】:

我对出色的语言-ext c# 库很陌生。

我有这段代码返回一个Try&lt;IEnumerable&lt;Try&lt;Unit&gt;&gt; 对象:

            Try(DetectAlertsToNotify)
            .MapT(SendNotification)
            //treat errors happened indifferently from their source

编辑:DetectAlertsToNotify 返回一个 IEnumerable 的 AlertDTO

我想要实现的是优雅地处理所有异常,或者可能是第一个异常,无论它发生在 DetectAlertsToNotify 或 SendNotification 中。

如何聚合所有错误或获取Try&lt;IEnumerable&lt;Try&lt;Unit&gt;&gt; 的第一个错误,同时保持代码尽可能简单和最少?

【问题讨论】:

你能给我们更多的代码吗?我正在尝试创建您的示例的工作版本,但找不到与Try&lt;Unit&gt; 一起使用的MapT 版本。看起来DetectAlertsToNotify 返回Unit,对吗?所以Try(DetectAlertsToNotify) 返回Try&lt;Unit&gt;。不过,我看不到如何在该结果上调用MapT。 (我有 F#/Haskell 经验,但之前从未使用过 LanguageExt。) 谢谢,事实上 DetectAlertsToNotify 返回一个 IEnumerable 好的,但是Try&lt;Unit&gt; 来自哪里? Try(DetectAlertsToNotify) 将返回 Try&lt;IEnumerable&lt;AlertDTO&gt;&gt;,但我仍然看不到任何将 MapT 应用于该类型的方法。 【参考方案1】:

也许你正在寻找这样的东西:

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&lt;T&gt; 而不是IEnumerable&lt;T&gt;,因为这样可以确保在Try 之外没有枚举,以防枚举时可能引发异常。否则我们可能需要一些帮助来确保枚举本身被某些Try 捕获。 Sequence() 将改变内部和外部 monad(容器)。这会将Arr&lt;Try&lt;Unit&gt;&gt; 变成Try&lt;Arr&lt;Unit&gt;&gt;。我们需要这个,因为我们想要/需要“留在”Try monad(LINQ 表达式)中。

如果您查看中间类型,您可能会明白。

【讨论】:

非常感谢,这正是我的情况,非常完美。我太专注于使用 MapT 将所有表达式保持在同一水平上。现在我明白了与 Bind 保持在同一个 monad 中的意义。

以上是关于Language-ext 在 Try<IEnumerable<Try<...>>> 时聚合异常/失败的主要内容,如果未能解决你的问题,请参考以下文章

csharp language-ext选项与FSharpOption构造

c# linq 汇总

yield关键字

[python]python try异常处理机制

python异常处理

JS中try.. catch..的用法