全部交易:
在下面的代码中,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
答案 0 :(得分:3)
您正在寻找模块Control.Exception
及其用于捕获/处理异常的大量函数,
在你的情况下
handler :: IOException -> IO [FilePath]
handler = undefined
walk :: FilePath -> IO()
walk dir = do
contentsFullPath <- handle handler $
getDirectoryContents dir
>>= removeDotFile
>>= getFullPath
...
除了参数被交换之外, handle
与catch
相同。它需要IO
计算,它可能会抛出异常,处理某种类型的异常,并运行计算,捕获特定类型的异常。
由于您可能无法返回FilePath
的适当列表,因此您可能希望更高级别地捕获异常,更像walk dir = handle handler $ do ...
,然后您可以只使用一个处理程序输入IOException -> IO ()
。
因为在这种情况下,我们对IO
例外感兴趣,即我们使用的例外情况。