【问题标题】:Haskell: catching low level IO exceptionsHaskell:捕获低级 IO 异常
【发布时间】:2013-06-26 03:25:21
【问题描述】:

根据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]
  • UnsatisfiedConstraints 不满足与实现相关的约束。 [忙]
  • UnsupportedOperation 在这种情况下,实现不支持重命名。 [EXDEV]
  • InappropriateType 任一路径均指现有目录。 [ENOTDIR、EISDIR、EINVAL、EEXIST、ENOTEMPTY]

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

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

【问题讨论】:

    标签: haskell exception-handling io


    【解决方案1】:

    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 的投诉。
    • 我不确定您的模式匹配到底出了什么问题,对我来说看起来还可以。我添加了为我编译和工作的完整示例。
    • 哈!我完全没有想到做不合格的进口!谢谢!
    • 错误出现在 import 语句中 - 我似乎无法弄清楚如何导入正确的构造函数。
    • @phunehehe haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/… 如果您在 IOErrorType 下向下查看页面的四分之三,它会列出 Haskell 和 GHC 特定的错误。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2011-04-08
    • 2011-07-10
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2019-05-25
    • 2018-11-02
    相关资源
    最近更新 更多