hGetContents返回一个惰性 String 对象,该对象可用于纯功能代码以从文件句柄中读取。如果在读取此惰性字符串时发生 I/O 异常,则底层文件句柄将静默关闭,并且不会将其他字符添加到惰性字符串中。
如何检测到此 I/O 异常?
作为一个具体的例子,考虑以下程序:
import System.IO -- for stdin
lengthOfFirstLine :: String -> Int
lengthOfFirstLine "" = 0
lengthOfFirstLine s = (length . head . lines) s
main :: IO ()
main = do
lazyStdin <- hGetContents stdin
print (lengthOfFirstLine lazyStdin)
如果在读取文件的第一行时发生异常,该程序将打印字符数,直到发生 I/O 异常。相反,我希望程序因适当的 I/O 异常而崩溃。如何修改该程序以具有该行为?
编辑:在仔细检查 hGetContents 实现后,I/O 异常似乎没有被忽略,而是通过调用纯功能代码冒泡到发生触发评估的任何 IO 代码,然后有机会处理它。(我以前不知道纯函数式代码会引发异常。)因此,这个问题是一个误解。
旁白:如果这种异常行为得到经验验证,那将是最好的。不幸的是,很难模拟低级 I/O 错误。