首页 > 解决方案 > 使用序列表达式时如何处理 F# 中的异常?

问题描述

我正在尝试编写一个 F# 函数,该函数读取 CSV 文件并将其行作为字符串序列返回,这些字符串可以在流水线表达式中进一步处理。该函数应处理打开和读取文件时可能出现的所有异常。到目前为止,这是我想出的:

// takes a filename and returns a sequence of strings
// returns empty sequence in case file could not be opened
let readFile (f : string) = 
  try 
    seq {
      use r = new StreamReader(f) // if this throws, exception is not caught below 
      while not r.EndOfStream do
        yield reader.ReadLine()   // same here 
    }
    with ex
        | ex when (ex :? Exception) -> 
            printfn "Exception: %s" ex.Message
            Seq.empty

这里的问题是异常处理程序可能抛出但未被捕获的异常StreamReader()ReadLine()而是未被捕获并导致程序终止。此外,似乎没有办法尝试在seq {}序列表达式中捕获异常。现在我想不出任何其他方法来设计这样一个函数,而不是预先将整个文件读入一个中间集合,比如一个列表或一个数组,然后将该集合作为一个序列返回给调用者,从而失去惰性评估的所有好处.

有没有人有更好的主意?

标签: f#

解决方案


let readFile (f : string) = 
    try File.ReadLines(f)
    with ex -> printfn "Exception: %s" ex.Message; Seq.empty

推荐阅读