ocaml - 如何在 OCaml 中将异常转换为结果

标签 ocaml

我正在使用这个功能

(** Wraps an exception in result *)
let try_ (f : 'a -> 'b) (x : 'a) : ('b, exn) result =
  try
    Ok (f x)
  with 
    e -> Error e

我不太确定这是否安全,或者 stdlib 中是否有更好的替代方案。我在一个带有 Lwt 的项目中使用它,也许需要处理 promise 拒绝?

动机是我将 Lwt_result.tlet (let*) = Lwt_result.Infix.(>>=) 一起使用,异常不适合很好用 let*

最佳答案

在大多数情况下,捕获异常而不重新引发的catch-all异常子句是一个编程错误。

事实上,可能会引发异常以表明本地计算上下文无效,并且应在异常处理程序定义的较远层上暂存并重新启动当前计算。例如,考虑 Out_of_memory 异常的最坏情况,在这种情况下,人们确实希望到达异常处理程序,在尝试执行其他操作之前释放一些内存。当您捕获任何异常时,即使是您一无所知的异常,您也会丢失此信息。

相反,捕获已知异常通常很好,因为您知道异常的含义和上下文。例如,翻译一个 代码中的 Not_found 异常通常没有问题

let to_opt f = match f with
| x -> Some x
| exception Not_found -> None

更一般地说,表示本地故障的异常可以转化为结果。但编写一个仅转换具有已知语义的异常的专用函数要安全得多。

关于ocaml - 如何在 OCaml 中将异常转换为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76722616/

相关文章:

ocaml - OCaml dune 可以构建具有平面目录结构的项目吗?

environment-variables - ocaml:是否有环境变量来设置#use和#load的搜索路径?

haskell - Haskell 或 OCaml 中的非本地类型推断真的有用吗?

polymorphism - 在 OCaml 中, `' 和 .` and ` 类型 a.` 和何时使用它们之间有什么区别?

list - 在OCaml中,为什么Core的List.find中有辅助功能?

ocaml - 带有可选和可变字段的记录

ocaml - 从函数构建序列

ocaml - 在 OCaml 中创建一个 tar 文件

ocaml - 如何将 OCaml 字节码映射到其原始源代码位置?

recursion - 带尾递归的慢字节码