我想知道如何最好地实现以下任务:
我想打开一个文件,对其进行一些操作,然后关闭它。我想确保在所有情况下,文件都被正确关闭。如果无法打开文件(不存在、访问被拒绝等),我还想运行特定的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
openFile
失败时执行handleOpeningError
操作,并在所有情况下关闭文件句柄。如果在workWith handle
期间发生异常,则在文件句柄关闭后重新抛出该异常(如果我理解正确,您只想处理由openFile
引发的异常,否则只需确保文件已关闭)。