如何在Haskell中处理这个简单的IO异常

时间:2014-01-17 14:25:04

标签: haskell

全部交易:

在下面的代码中,getDirectoryContents dir可能会失败。例如,dir可能不存在。如何捕获这个并向用户发送有意义的消息?我知道IO异常处理已被多次询问,但我仍然找不到一种简单的方法来执行此操作。

walk :: FilePath -> IO()
walk dir = do
    contentsFullPath <- getDirectoryContents dir >>= removeDotFile >>= getFullPath
    dirList <- filterM doesDirectoryExist contentsFullPath
    fileList <- filterM doesFileExist contentsFullPath
    forM_ fileList processFile >> forM_ dirList walk            
    where
        removeDotFile = return . filter (`notElem` ["..", "."])
        getFullPath = return . zipWith ( </> ) (repeat dir)
        processFile = getFileSize

1 个答案:

答案 0 :(得分:3)

您正在寻找模块Control.Exception及其用于捕获/处理异常的大量函数,

在你的情况下

handler :: IOException -> IO [FilePath]
handler = undefined

walk :: FilePath -> IO()
walk dir = do
    contentsFullPath <- handle handler $ 
                          getDirectoryContents dir
                          >>= removeDotFile
                          >>= getFullPath
    ...
除了参数被交换之外,

handlecatch相同。它需要IO计算,它可能会抛出异常,处理某种类型的异常,并运行计算,捕获特定类型的异常。

由于您可能无法返回FilePath的适当列表,因此您可能希望更高级别地捕获异常,更像walk dir = handle handler $ do ...,然后您可以只使用一个处理程序输入IOException -> IO ()

因为在这种情况下,我们对IO例外感兴趣,即我们使用的例外情况。