我正在 try catch 由于操作 ([1,2] !! 3) 引起的异常。我不能。
我正在尝试
let a = [1,2]
handle (\(e::SomeException) -> print "err">> return 1) (return $ a !! 3)
Control.Exception.catch (return $ a !! 3) (\(e::SomeException) -> print "err">> return 1)
在两者中我都得到异常:前奏。(!!):索引太大*
这可能吗?也许我要使用 Maybe 方法。
感谢您的帮助。
最佳答案
惰性和异常,就像惰性和并行性一样,以微妙的方式相互作用!
return
将数组访问包装在一个 thunk 中,以便返回时不进行计算,从而导致在处理程序之外对异常进行计算。
解决方案是确保计算 return
也必须计算列表索引。在这种情况下,这可以通过 $!
完成:
handle ((e :: SomeException) -> print "err" >> return 1) (return $! a !! 3)
关于 haskell 。非IO异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344375/