Haskell:捕获低级IO异常

Imp*_*ive 5 io haskell exception-handling

根据System.Directory haddock,renameFile可能由于多种原因而失败:

  • HardwareFault发生了物理I/O错误.[EIO]
  • InvalidArgument任一操作数都不是有效的文件名.[ENAMETOOLONG,ELOOP]
  • isDoesNotExistError/NoSuchThing原始文件不存在,或者没有目标路径.[ENOENT,ENOTDIR]
  • isPermissionError/PermissionDenied进程没有足够的权限来执行操作.[EROFS,EACCES,EPERM]
  • ResourceExhausted资源不足,无法执行操作.[EDQUOT,ENOSPC,ENOMEM,EMLINK]
  • 不满意的约束不满足依赖于实现的约束.[EBUSY]
  • UnsupportedOperation在这种情况下,实现不支持重命名.[EXDEV]
  • InappropriateType两个路径都指现有目录.[ENOTDIR,EISDIR,EINVAL,EEXIST,ENOTEMPTY]

其中一些(isPermissionError,isDoesNotExistError)具有测试功能,但其他(包括我感兴趣的UnsupportedOperation)似乎并不对应任何东西.我UnsupportedOperation可以测试它是什么以及如何测试?

更一般地说,我应该如何找出这样的东西.我无法在源代码中看到它所引发的任何地方,所以我猜它是一个包含较低级别错误的包装器 - 但我应该如何处理这些?

Yur*_*ras 5

UnsupportedOperationghc特定的.所以你必须导入GHC.IO.Exception,它包含检查异常类型所需的一切.

这是一个例子:

import Control.Exception
import GHC.IO.Exception

main :: IO ()
main = do
  action `catch` (\(IOError _ UnsupportedOperation _ _ _ _) -> print "UnsupportedOperation")
  where
  action = throw $ IOError Nothing UnsupportedOperation "loc" "desc" Nothing Nothing
Run Code Online (Sandbox Code Playgroud)