我有一个常规的Haskell代码,用于读取文件并处理任何异常:
handle ((\_->return "ERROR") :: SomeException -> IO String) $ readFile "file.txt"
当我试图读取错误编码的文件时,总是会出现错误:
*** Exception: file.txt: hGetContents: invalid argument (invalid byte sequence)
程序没有进入我的异常处理函数中。我也尝试使用 IOError
和 IOException
类型替换 SomeException
,但并没有改变任何内容。
如果使用句柄打开类似的文件,并使用以下代码读取:
handle ((\_->return "ERROR") :: SomeException -> IO String) (hGetContents myHandle)
运行正常。
如何正确地捕获由readFile
传递的hGetContents
抛出的异常?
readFile
函数似乎有惰性 IO 的特点 - 只有在返回字符串后才读取文件?尝试在handle
内强制求值。 - BergiString
,现在不再处于handle
函数内。3. 尝试在REPL上打印整个字符串,从而强制读取所有内容。4. 遇到错误并抛出异常。 - Thomas M. DuBuisson