Haskell:捕获低级IO异常

5
根据System.Directory haddockrenameFile 可能因以下原因之一而失败:
  • HardwareFault 发生了物理 I/O 错误。[EIO]
  • InvalidArgument 任何一个操作数都不是有效的文件名。[ENAMETOOLONG,ELOOP]
  • isDoesNotExistError / NoSuchThing 原始文件不存在或没有到目标的路径。[ENOENT,ENOTDIR]
  • isPermissionError / PermissionDenied 进程权限不足以执行该操作。[EROFS,EACCES,EPERM]
  • ResourceExhausted 没有足够的资源执行该操作。[EDQUOT,ENOSPC,ENOMEM,EMLINK]
  • UnsatisfiedConstraints 实现相关的约束未被满足。[EBUSY]
  • UnsupportedOperation 在此情况下,实现不支持重命名。[EXDEV]
  • InappropriateType 任何一个路径引用现有目录。[ENOTDIR,EISDIR,EINVAL,EEXIST,ENOTEMPTY]
其中一些(isPermissionError,isDoesNotExistError)具有测试函数,但其他一些(包括我感兴趣的UnsupportedOperation)似乎没有对应的函数。什么是 UnsupportedOperation,我该如何测试它?
更一般地说,我应该如何找出这样的东西。我看不到源代码中引发它的任何地方,所以我猜它是低级错误的包装器,但我该如何处理这些?
1个回答

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

您能否举个例子?我正在尝试使用 IOError _ UnsupportedOperation _ _ _ _ -> Just x,但是收到了有关未导出 IOError/IOException 的投诉。 - Impredicative
我不确定你的模式匹配出了什么问题,对我来说看起来还好。我添加了一个完整的例子,它可以编译并在我的机器上运行。 - Yuras
哈!竟然没有想到进行不合格的导入!谢谢! - Impredicative
错误出现在导入语句上 - 我无法弄清如何导入正确的构造函数。 - Impredicative
有人能告诉我如何找出某些东西是否是 GHC 特定的吗? - phunehehe
1
如果您在页面的三分之三处查看IOErrorType,它列出了Haskell和GHC特定的错误。 - Carcigenicate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接