我正在使用这个功能
(** 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.t
与 let (let*) = Lwt_result.Infix.(>>=)
一起使用,异常不适合很好用 let*
最佳答案
在大多数情况下,捕获异常而不重新引发的catch-all
异常子句是一个编程错误。
相反,捕获已知异常通常很好,因为您知道异常的含义和上下文。例如,翻译一个
代码中的 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/