Haskell:捕获低级IO异常

时间:2013-06-28 11:06:31

标签: haskell exception-handling io

根据the System.Directory haddockrenameFile可能会因多种原因而失败:

  • 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,我该如何测试呢?

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

1 个答案:

答案 0 :(得分:5)

UnsupportedOperationghc-specific。因此,您必须导入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