Haskell 用于文件处理的多个异常处理程序

Haskell 用于文件处理的多个异常处理程序,haskell,exception-handling,io,Haskell,Exception Handling,Io,我想我的大脑快要湿透了。有人能解释一下这是完成以下任务的最佳方式吗 我想打开一个文件,用它做一些事情,然后关闭它。我想确保在任何情况下,文件都是绝对关闭的。如果打开文件失败(不存在、访问被拒绝等),我还希望运行特定的I/O操作 对于清理,我可能需要括号,对于处理打开故障,我可能需要try的一些变体。但是,我无法决定如何最好地将它们组合在一起,这样它就可以做正确的事情,同时又不会留下任何“缺口”(错误时刻的异常可能会破坏文件)。使用尝试打开文件。如果成功,请使用最终处理文件句柄,然后关闭文件。如果

我想我的大脑快要湿透了。有人能解释一下这是完成以下任务的最佳方式吗

我想打开一个文件,用它做一些事情,然后关闭它。我想确保在任何情况下,文件都是绝对关闭的。如果打开文件失败(不存在、访问被拒绝等),我还希望运行特定的I/O操作


对于清理,我可能需要
括号
,对于处理打开故障,我可能需要
try
的一些变体。但是,我无法决定如何最好地将它们组合在一起,这样它就可以做正确的事情,同时又不会留下任何“缺口”(错误时刻的异常可能会破坏文件)。

使用
尝试打开文件。如果成功,请使用
最终
处理文件句柄,然后关闭文件。如果打开文件失败,请进入错误案例。所以代码应该是这样的:

do
  res <- try (openFile filename mode)
  case res of
    Right handle ->
      finally (workWith handle) (hClose handle)
    Left (e :: SomeException) ->
      handleOpeningError e
do
物件
最后(使用手柄)(hClose手柄)
左(e::SomeException)->
手爪

如果
openFile
失败,这将执行
handleOpeningError
操作,并在所有情况下关闭文件句柄。如果在
workWith handle
期间发生异常,则在关闭文件句柄后将重新引发该异常(如果我理解正确,您只希望处理由
openFile
引发的异常,否则您只希望确保文件已关闭).

以下是关于在Haskell中进行文件处理的三点意见:

作者建议使用以下方法/库之一:

谁说过懒惰的I/O?我想要一个手柄,这样我就可以阅读严格的BYTESTRING,并进行大量的前后搜索。我的印象是,上述库是用于顺序访问,而不是随机访问。