2009-01-04 101 views
3

哈斯克尔今天让我头痛。我想处理一个异常。当它到达顶部时,它打印如下:如何处理这个异常?

***例外:../p/trip/Trip.hs:(88,16)-(89,50):函数split中的非穷举模式

对我来说,它看起来是PatternMatchFail,但这不起作用:

handle (\(PatternMatchFail _) -> return env) f 

我的意思是,它编译,但不处理异常。我究竟做错了什么?这是错误的例外还是什么?有没有办法捕捉任何异常?

+0

顺便说一句,在社区这是一个“错误”,而不是一个例外。这是一个不正确的功能,正确的答案不是处理它,而是修复功能。当然,有时你不能... – luqui 2009-01-06 02:11:01

回答

1

如果修复错误的来源是不是一种选择,你应该看看这个: 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的评估推迟到稍后(懒惰),则此异常也将稍后在不同的地方抛出(在这种情况下,它是使用该值的“打印”),它可能不会被抓住。

+0

是的,就是这样。计算被推迟,异常被抛出。懒惰评估再次被咬了一次。 – luntain 2009-01-04 22:36:21