文件处理的多个异常处理程序

4

我想知道如何最好地实现以下任务:

我想打开一个文件,对其进行一些操作,然后关闭它。我想确保在所有情况下,文件都被正确关闭。如果无法打开文件(不存在、访问被拒绝等),我还想运行特定的I/O操作。

为了清理工作,我需要使用 bracket 函数;为了处理打开失败,我需要使用 try 函数的某个变体。但是我无法决定如何最佳组合这些函数以便它们能够正确执行任务,同时又不会留下任何“漏洞”(即错误时导致程序崩溃的地方)。

2个回答

3

使用try来打开文件。如果成功,使用finally来处理文件句柄并在之后关闭文件。如果打开文件不成功,则进入错误处理流程。因此代码应该类似于下面这样:

do
  res <- try (openFile filename mode)
  case res of
    Right handle ->
      finally (workWith handle) (hClose handle)
    Left (e :: SomeException) ->
      handleOpeningError e

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

1

谁说了什么关于“懒惰”I/O的事情?我想要一个句柄,这样我就可以读取严格的ByteStrings并进行大量向前和向后的寻址。我的印象是上述库是用于顺序访问而不是随机访问的。 - MathematicalOrchid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接