在F#中使用结果管理异常

时间:2019-01-08 05:17:23

标签: 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/中使用它)?

我知道最好避免使用异常处理,但是我希望有一些“安全”的东西,但不要花很多时间。

谢谢

1 个答案:

答案 0 :(得分:3)

是的,将所有异常都捕获到Result中是完全合理的,特别是如果您正在做一个自包含的解决方案。

如果1)您正在设计一个供其他人使用的库,或者2)您的代码是一个较大的框架的一部分,该框架已经处理了未处理的异常并适当地记录了错误,则保留异常是有意义的。