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

如何在Haskell中处理这个简单的IO异常,haskell,Haskell,全部交易: 在下面的代码中,getDirectoryContents dir可能会失败。例如,dir可能不存在。如何捕捉这些信息并向用户抛出有意义的消息?我知道IO异常处理已经被问过很多次了,但我仍然找不到一个简单的方法来做这件事 walk :: FilePath -> IO() walk dir = do contentsFullPath <- getDirectoryContents dir >>= removeDotFile >>= getFul

全部交易:

在下面的代码中,
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
walk::FilePath->IO()
步行方向
contentsFullPath>=removeDotFile>>=getFullPath
dirList表单udirlist walk
哪里
removeDotFile=返回。过滤器(`notElem`[“.”、“]”)
getFullPath=return。zipWith()(重复dir)
processFile=getFileSize

您正在寻找一个模块,该模块包含一系列用于捕获/处理异常的函数

就你而言

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

walk :: FilePath -> IO()
walk dir = do
    contentsFullPath <- handle handler $ 
                          getDirectoryContents dir
                          >>= removeDotFile
                          >>= getFullPath
    ...
handler::IOException->IO[FilePath]
处理程序=未定义
walk::FilePath->IO()
步行方向
contentsFullPath>=removeDotFile
>>=获取完整路径
...
handle
catch
相同,只是参数被交换了。它接受一个可能抛出异常的
IO
计算,一个针对某种类型异常的处理程序,然后运行计算,捕获特定类型的异常

由于您可能无法返回适当的
文件路径列表
s,因此您可能希望使用类似于
walk dir=handle handler$do…
的方法捕获更高级别的异常,然后您可以简单地使用
IOException->IO()
类型的处理程序

因为在本例中,我们对
IO
异常感兴趣,所以我们使用的是