我想我的大脑要湿透了。有人可以解释为完成以下任务的最佳方式吗?
我想打开一个文件,用它做一些事情,然后关闭它。我想确保在所有情况下,文件肯定是关闭的。如果打开文件失败(不存在、访问被拒绝等),我还想运行特定的 I/O 操作
对于清理,我大概想要bracket
.,为了处理打开失败,我大概想要try
. 但我无法决定将这些组合在一起的最佳方式,以便它做正确的事情,而不留下任何“差距”(在错误时刻出现异常可能会破坏东西的地方)。
我想我的大脑要湿透了。有人可以解释为完成以下任务的最佳方式吗?
我想打开一个文件,用它做一些事情,然后关闭它。我想确保在所有情况下,文件肯定是关闭的。如果打开文件失败(不存在、访问被拒绝等),我还想运行特定的 I/O 操作
对于清理,我大概想要bracket
.,为了处理打开失败,我大概想要try
. 但我无法决定将这些组合在一起的最佳方式,以便它做正确的事情,而不留下任何“差距”(在错误时刻出现异常可能会破坏东西的地方)。
用于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
否则您只想确保文件已关闭)。
以下是关于在 Haskell 中进行文件处理的三个评论:http:
//newartisans.com/2013/05/three-examples-of-problems-with-lazy-io
作者建议使用以下方法/库之一: