4

我想我的大脑要湿透了。有人可以解释为完成以下任务的最佳方式吗?

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

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

4

2 回答 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

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

于 2013-06-15T14:46:24.747 回答
1

以下是关于在 Haskell 中进行文件处理的三个评论:http:
//newartisans.com/2013/05/three-examples-of-problems-with-lazy-io

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

于 2013-06-15T20:13:07.547 回答