哈斯克尔今天让我头痛。我想处理一个异常。当它到达顶部时,它打印如下:如何处理这个异常?
***例外:../p/trip/Trip.hs:(88,16)-(89,50):函数split中的非穷举模式
对我来说,它看起来是PatternMatchFail,但这不起作用:
handle (\(PatternMatchFail _) -> return env) f
我的意思是,它编译,但不处理异常。我究竟做错了什么?这是错误的例外还是什么?有没有办法捕捉任何异常?
哈斯克尔今天让我头痛。我想处理一个异常。当它到达顶部时,它打印如下:如何处理这个异常?
***例外:../p/trip/Trip.hs:(88,16)-(89,50):函数split中的非穷举模式
对我来说,它看起来是PatternMatchFail,但这不起作用:
handle (\(PatternMatchFail _) -> return env) f
我的意思是,它编译,但不处理异常。我究竟做错了什么?这是错误的例外还是什么?有没有办法捕捉任何异常?
如果修复错误的来源是不是一种选择,你应该看看这个: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html
我相信用“处理”或“尝试”或“捕捉”或任何来自Control.Exception是关键在于,标准前奏中的函数只处理IO-Exceptions,而不是纯代码中的错误。
在Haskell98中,纯代码无法处理异常。纯函数必须返回一个值,异常是一个返回值的失败。
实施例:
import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"
main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
C.handle (\_ -> return "caught") (C.evaluate y) >>= print
要计算的呼叫是迫使x和y的评价,Haskell的懒惰和所有。
如果您将x的评估推迟到稍后(懒惰),则此异常也将稍后在不同的地方抛出(在这种情况下,它是使用该值的“打印”),它可能不会被抓住。
是的,就是这样。计算被推迟,异常被抛出。懒惰评估再次被咬了一次。 – luntain 2009-01-04 22:36:21
顺便说一句,在社区这是一个“错误”,而不是一个例外。这是一个不正确的功能,正确的答案不是处理它,而是修复功能。当然,有时你不能... – luqui 2009-01-06 02:11:01