我想我的大脑会变得潮湿。有人可以解释是实现以下任务的最佳方式吗?
我想打开一个文件,用它做一些东西,然后关闭它。我想确保在所有情况下,文件肯定是关闭的。如果打开文件失败(不存在,访问被拒绝等),我也想运行特定的I / O操作
对于清理,我可能想要bracket
,并且为了处理开放式失败,我可能想要一些try
的变体。但我无法决定将这些结合起来的最佳方式,以便它做正确的事情,而不会留下任何“空白”(在错误的时刻出现异常的地方可能会破坏东西)。
答案 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)