gpt4 book ai didi

error-handling - 代表F#中失败的歧视工会的优雅解决方案

转载 作者:行者123 更新时间:2023-12-03 07:40:13 26 4
gpt4 key购买 nike

我正在从在F#中创建和捕获异常转移到围绕Result<'T, 'TError>构建的东西。我找到了this,这与我最初用歧视的联合体表示失败的最初追求相吻合,但是我遇到了我的Failure联合的联合体存在很多不同情况的问题:

type TypedValue =
| Integer of int
| Long of int64
| …

type Failure =
| ArgumentOutOfRange of {| Argument : TypedValue; Minimum : TypedValue; Maximum : TypedValue |}
| BufferTooSmall of {| RequiredSize : int |}
| Exception of exn
| IndexOutOfRange of {| Index : int |}
| …

我不希望有许多专用于错误处理的类型。这种“类型化值”一点都不优雅,因为我要么必须创建冲突的名称( ByteSystem.Byte),要么创建长名称以避免冲突( | UnsignedByte of byte)。

泛型是可能的,但是 'T中的 Failure<'T>代表什么? ArgumentOutOfRange并不是唯一的可区分联合,并且在某些情况下可能需要更多类型参数或根本不需要。

最佳答案

在您确实需要处理的自定义错误类型的情况下,或者在除了标准异常实现的错误之外,您还可以使用其他逻辑来传播错误的情况下,使用Result<'T, 'TError>非常有意义(例如,尽管出现错误的事实)。但是,我不会将其用作异常(exception)的1:1替代品-它只会使您的代码不必要地变得复杂繁琐,而没有真正给您带来很多好处。

要回答您的问题,由于您在已区分的联合中镜像标准.NET异常,因此您可以只在Result类型中使用标准.NET异常,并使用Result<'T, exn>作为数据类型:

if arg < 10 then Error(ArgumentOutOfRangeException("arg", "Value is too small"))
else OK(arg - 1)

关于 ArgumentOutOfRange联合用例和 TypedValue-使用类似 TypedValue之类的原因通常是,您需要对可能的值进行模式匹配并对其进行处理。在异常(exception)情况下,您要如何使用这些值?如果您只需要将其报告给用户,则可以使用 obj,它可以让您轻松地打印它们(获取数值并对其进行进一步的计算并不是那么容易,但是我不认为您需要)。
type Failure = 
| ArgumentOutOfRange of {| Argument : obj; Minimum : obj; Maximum : obj |}

关于error-handling - 代表F#中失败的歧视工会的优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55369082/

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