小编Mat*_*hew的帖子

正确处理readFile和writeFile异常的方法

我正在Haskell中编写一个应用程序,如果失败readFile或想要向用户显示有意义的错误消息writeFile.我正在IOError使用Control.Exception.tryJust并将它们转换为人类可读的文本.

但是,我无法弄清楚应该捕获哪些错误以及如何从中提取信息.例如,假设"/ bin"是一个目录而"/ bin/ls"是一个文件,readFile "/bin"并且readFile "/bin/ls/asdf"两者都给出"不合适的类型",但(在我看来)它们是不同的错误.在第一个的情况下,我可以通过处理目录中的每个文件来恢复,而第二个更像是"不存在"类型的错误.

与前面的例子相比,似乎没有一种可移植的方式来捕获"不适当类型"错误.看GHC.IO.Exception,InappropriateType只标记GHC,所以我不能只是模式匹配ioeGetErrorType.我可以模式匹配,ioeGetErrorString但我不确定这些字符串在不同平台,编译器,语言环境等之间是否总是相同的.

总之,我的问题是:

  1. 我应该抓住哪些例外readFile/ writeFile
  2. 一旦我有异常,我该如何从中提取信息?
  3. 是否有一种可移植的方式来捕获仅GHC的例外情况,例如InappropriateType

更新:

根据@ ErikR的回答,我正在查看GHC.IO.Exception.IOException以下Haskell程序的字段:

import Control.Exception (try)
import GHC.IO.Exception (IOException(..))
import qualified Data.ByteString as B


main :: IO ()
main = do
    try (readFile "/nonexistent") >>= printException
    try (writeFile "/dev/full" " ") >>= printException
    try (readFile "/root") >>= printException
    try (readFile "/bin") …
Run Code Online (Sandbox Code Playgroud)

error-handling file-io haskell

6
推荐指数
1
解决办法
989
查看次数

标签 统计

error-handling ×1

file-io ×1

haskell ×1