Haskell - 检查文件句柄的有效性

6 io monads file-io haskell exception

好的,伙计们,这是一个非常简单的问题(谷歌没有帮我解决这个问题似乎很奇怪):

import IO

--.... yadda, yadda, yadda

  file <- openFile "/some/path" ReadMode
Run Code Online (Sandbox Code Playgroud)

如何检查我获得的句柄openFile是否是有效句柄,即文件是否存在并且是否已成功打开?

Don*_*art 8

如果文件不存在或发生其他错误,则调用openFile将失败并出现异常.

例如:

import System.IO

main = do
   openFile "/some/path" ReadMode
Run Code Online (Sandbox Code Playgroud)

失败:

A.hs: /some/path: openFile: does not exist (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

openFile 此处列出了可能引发的异常类型,包括:

  • isAlreadyInUseError如果文件已经打开且无法重新打开;
  • 如果文件不存在,则为isDoesNotExistError; 要么
  • 如果用户没有打开文件的权限,则为isPermissionError.

您可以使用Control.Exception捕获这些错误,如下所示:

{-# LANGUAGE ScopedTypeVariables #-}

import System.IO
import Control.Exception

main = do
    handle (\(e :: IOException) -> print e >> return Nothing) $ do
      h <- openFile "/some/path" ReadMode
      return (Just h)
Run Code Online (Sandbox Code Playgroud)