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

时间:2013-06-15 13:47:49

标签: haskell exception-handling io

我想我的大脑会变得潮湿。有人可以解释是实现以下任务的最佳方式吗?

我想打开一个文件,用它做一些东西,然后关闭它。我想确保在所有情况下,文件肯定是关闭的。如果打开文件失败(不存在,访问被拒绝等),我也想运行特定的I / O操作

对于清理,我可能想要bracket,并且为了处理开放式失败,我可能想要一些try的变体。但我无法决定将这些结合起来的最佳方式,以便它做正确的事情,而不会留下任何“空白”(在错误的时刻出现异常的地方可能会破坏东西)。

2 个答案:

答案 0 :(得分:3)

使用try打开文件。如果成功使用finally来处理文件句柄并在之后关闭文件。如果打开文件不成功,请进入错误案例。所以代码看起来应该是这样的:

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

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

答案 1 :(得分:1)