f# - 使用 F# 中的结果管理异常

标签 f#

我必须对一些格式非常糟糕的 CSV 文件进行一些操作(一个文件中有多个不同的表等)。

为此,我使用 CsvFile.Load 并在字符串的 Seq 上写入函数。

但是,为了管理可能出现的异常,我编写了这样一个函数。

let tryWithResult f i =
    try
        f i |> Result.Ok
    with
    | e -> ("Exception Raised: " + e.Message + "\n" + e.Source) |> Result.Error

签名:

val tryWithResult : f:('a -> 'b) -> i:'a -> Result<'b,string>

就 F#/FP 良好实践而言,您认为这是正确的方法吗(因此我可以在面向铁路的编程 https://fsharpforfunandprofit.com/posts/recipe-part2/ 中使用它)?

我知道避免异常处理总是更好,但我想要一些相当“安全”的东西,但又不想花几个小时在上面。

谢谢

最佳答案

是的,捕获所有异常并将它们放入 Result 中是完全合理的,特别是如果您正在执行一个独立的解决方案。

如果 1) 您正在设计一个供其他人使用的库,或者 2) 您的代码是一个更大的框架的一部分,该框架已经很好地处理了未处理的异常并适本地记录了错误,那么放弃异常是有意义的。

关于f# - 使用 F# 中的结果管理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54085600/

相关文章:

.net - 明显的 F#/BCL 浮点错误

generics - 使用 F# 的静态类型参数和编码数字常量

open-source - F# 是开源的吗?

f# - 将函数作为参数传递并重载它

F# - 变量范围

.net - 当编译器坚持认为不可能时,如何从 Newtonsoft 检查 `null`?

sockets - 如何捕获SocketException

f# - 比较每个列表中唯一项目的两个列表

f# - 哪些区别 "Seq"和 "seq"?

c# - 关于使用 F# 创建可从 C# 使用的 Matrix 程序集