F# 异步中的结果与提升?

2023-12-21

似乎有两种方法可以返回错误async工作流程:raise and Result.

let willFailRaise = async {
  return raise <| new Exception("oh no!")
}

let willFailResult = async {
  return Result.Error "oh no!"
}

对于调用者来说,处理有点不同:

async {
  try 
    let! x = willFailRaise
    // ...
  with error -> 
    System.Console.WriteLine(error)
}

async {
  let! maybeX = willFailResult
  match maybeX with
  | Result.Ok x -> 
    // ...
  | Result.Error error -> 
    System.Console.WriteLine(error)
}

我的问题是:

  • 每种方法的优点/缺点是什么?
  • 哪种方法更符合 F# 习惯?

这取决于我们谈论的是哪种错误。基本上有3种:

  • 域错误(例如,用户提供的数据无效、使用此电子邮件的用户已注册等)
  • 基础设施错误(例如,您无法连接到另一个微服务或数据库)
  • 恐慌(例如NullReferenceExceptionor StackOverflowException等),这是由于程序员的错误造成的。

虽然这两种方法都可以完成工作,但通常您应该关心的是使您的代码尽可能自记录且易于阅读。这意味着以下内容:

  • 域错误:一定要去Result。这些“错误”是预料之中的,它们是您工作流程的一部分。使用Result在函数的签名中反映了您的业务规则,这非常有用。
  • 基础设施故障:这取决于。如果你有微服务,那么这些失败可能是预料之中的,也许使用起来会更方便Result。如果没有——就寻求例外。
  • Panics:确实Exception。首先,你不能覆盖一切 with Result,无论哪种方式,你都需要全局异常过滤器。第二件事 - 如果你试图覆盖所有可能的恐慌 - 代码会很快变成一场可怕的灾难,这将消除使用的全部意义Result对于域错误。

所以这确实与Async或者C#互操作,它是关于代码的可读性和可维护性。 至于 C# iterop ——不用担心,Result有所有可以提供帮助的方法,例如IsError等等。但您始终可以添加扩展方法:

[<AutoOpen>] module Utils = type Result<'Ok, 'Error> with member this.Value = match this with | Ok v -> v | Error e -> Exception(e.ToString()) |> raise

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 异步中的结果与提升? 的相关文章

随机推荐

  • 处理多个 NSTableView 的最佳方法

    在不使用 Cocoa Bindings 的情况下处理多个 NSTableView 的最佳方法是什么 在我的应用程序中 我有两个 NSTableViews 它们之间的关系足够密切 因此我使用相同的对象作为两者的委托和数据源 问题是两个 tab
  • 求一个数的真正大幂

    I am creating a small game for students and in a place it has to display the value of 27830457 1 如果数字不是那么大 我可以调用 BigInte
  • ReactJS + Socket.IO - 处理套接字连接的最佳方式

    我正在尝试使用 Node 和 Socket IO 制作一个 ReactJS 实时应用程序 但我很难找出在客户端处理套接字连接的最佳方法 我有多个 React 组件 它们都需要来自服务器的一些信息 并且最好通过套接字连接实时获取 但导入时so
  • 具有多个条件的 VLOOKUP 在一个单元格中返回值

    我发现这个 VBA 能够使用一个匹配条件将所有匹配值返回到一个单元格中 Function MYVLOOKUP pValue As String pWorkRng As Range pIndex As Long Update 20150310
  • 输入文件 onchange 事件未在 Chrome 中触发

    这是我在 chrome 中注意到的一件奇怪的事情 如果用户选择一个文件 然后再次打开文件对话框再次选择同一文件 则 chrome 不会触发 onchange 事件 而 firefox 会触发 有人也注意到了吗 这是 Chrome 的一项已知
  • 锁和监视器可以安全地用于同一个对象吗?

    我有以下情况 我想相互排除对对象的访问 到目前为止我通常会使用锁对象 object lockObject new object method1 lock lockObject CODE1 现在我还有一个可以从另一个线程调用的方法 它不应该被
  • 设备中的sign_in_and_redirect如何工作?

    if user persisted sign in and redirect user event gt authentication this will throw if user is not activated set flash m
  • 如何为一组目标创建 Maven 别名?

    我正在配置一个 Maven 项目并希望能够使用别名 例如 mvn server 执行mvn clean package tomcat run Grunt 任务运行器做得很好 但我还没有找到在 Maven 中做同样事情的方法 是否可以 您可以
  • 如何阅读 C 声明?

    我听说过一些方法 但没有一个能坚持下来 就我个人而言 我尝试避免 C 中的复杂类型 并尝试将它们分解为组件 typedef 我现在面临着维护一些来自所谓的 三星级程序员 的遗留代码 并且我很难阅读一些 代码 如何阅读复杂的 C 声明 本文解
  • Autohotkey 多个热键映射到同一功能

    我有几个热键 它们都做同样的事情 我有多个热键 所以我可以在我的手当时在的任何地方调用它们 并且可以在多个键盘上使用 例如 Send Media Next XButton2 RButton Send Media Next SC15D Sen
  • 如何在搅拌机中导出带有纹理的.obj格式文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 First of all i am new in blender i have attached texture from tree ob
  • 爪哇 |整数运算符;

    我用 Java 编程大约一年了 但仍然发现了一些我不知道的东西 如何 new Font FontFamily TIMES ROMAN 12 1 4 如何 可以处理整数吗 谢谢 附 我用谷歌搜索了很多 The 运算符计算 按位或 http d
  • Windows 中崩溃进程的可预测退出代码

    对于Windows中正常退出的进程来说 进程的退出码一般是以下的返回值 main 或传递给的退出代码std exit ERRORLEVEL 然后可以用于查询退出代码 并且可以用于确定程序是否正确执行 或者是否存在一些指示特定问题 特定于应用
  • 使用 astype 在 H5py 中创建对 HDF 数据集的引用

    来自h5py 文档 http docs h5py org en latest high dataset html Dataset astype 我发现我可以使用以下命令将 HDF 数据集转换为另一种类型astype数据集的方法 这会返回一个
  • 通过 REST 将消息发送到 Azure 服务总线队列

    Azure 队列向 REST API 公开 为了使 REST 调用正常工作 我在 POSTMAN 上进行了示例测试 POST 调用 https yournamespace servicebus windows net yourentity
  • 仅在持久函数中扇出(并忘记)

    我有一个现有的函数应用程序 带有 2 个函数和一个存储队列 F1 由服务总线主题中的消息触发 对于收到的每个消息 F1 计算一些必须以不同的延迟量执行的子任务 T1 T2 例如 T1 在 3 分钟后触发 T2 在 5 分钟后触发 等等 F1
  • SQL Server Management Studio:图标含义

    我只是想知道这个图标在 SQL Server 2008 Management Studio 中意味着什么 在减号和带有绿色箭头的数据库图标之间 数据库引擎正在按预期工作 SQL Server 代理也正在运行 有人能帮我吗 截屏 https
  • 如何通过 javascript 将图像/ HTML 画布切成两半?

    我正在使用 html2canvas 将具有自定义功能的谷歌地图 javascript API 转换为画布 然后转换为图像 在所有浏览器上都可以正常工作 但在 IE 11 上它会生成一个图像 图像右侧有额外的空白区域 等于 浏览器窗口的宽度
  • 传递到字典中的模型项的类型为“mvc.Models.ModelA”,但该字典需要类型为“mvc.Models.ModelB”的模型项

    我在一些构建中遇到了这个恼人的错误 项目中没有错误 因为如果我再次构建 问题就会消失 仅当站点部署到 Windows 2008 Server 时才会出现该消息 我首先认为这可能是临时文件的问题 但事实并非如此 我将构建部署到不同的网络 但错
  • F# 异步中的结果与提升?

    似乎有两种方法可以返回错误async工作流程 raise and Result let willFailRaise async return raise lt new Exception oh no let willFailResult a