hGetContents返回一个懒惰的String对象,该对象可用于纯功能性代码中从文件句柄读取。如果在读取此懒惰字符串时发生I/O异常,则会默认关闭基础文件句柄,并且不会将其他字符添加到懒惰字符串中。从hGetContents中检测延迟字符串中的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错误。
我会在推荐非惰性I/O作为更强大的替代方案的基础上接受这一点。 – 2013-04-29 15:40:04