f# - 使用序列表达式时如何处理 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 {}
序列表达式中捕获异常。现在我想不出任何其他方法来设计这样一个函数,而不是预先将整个文件读入一个中间集合,比如一个列表或一个数组,然后将该集合作为一个序列返回给调用者,从而失去惰性评估的所有好处.
有没有人有更好的主意?
解决方案
let readFile (f : string) =
try File.ReadLines(f)
with ex -> printfn "Exception: %s" ex.Message; Seq.empty
推荐阅读
- php - 如何禁用日期选择器中的所有天数而不是提供的天数?
- macos - OSX 32 位上的 Clang 是否支持 AVX512 内在函数?
- javascript - React - 更改数组的状态无法正确呈现
- azure - Azure 搜索建议 API - 无序关键字没有结果
- python - 需要新变量吗?如何在 python 3.x 中写入新文件(csv?)?
- javascript - 将静态数据存储在图像而不是数组中是否有任何优势?
- javascript - 为什么没有显示状态问题?
- python - 如何将此系列转换为嵌套的 json 字符串?
- javascript - onClick 事件后控制台未记录
- python - 字典列表的批量插入