haskell 。非IO异常处理

标签 haskell exception

我正在 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/

相关文章:

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

python - 向异常添加信息?

haskell - 将 Haskell 多态余弦函数转换为 F#

haskell - 延迟 IO + 并行 : converting an image to grayscale

haskell - 解析一个列表,其分隔符也可能出现在末尾

c# - 如何传递 Exception.Data

java - 线程安全队列类出现问题。具体来说,除了异常(exception)情况

c# - Entity Framework v5 候选版本在模型中使用枚举时抛出异常

user-interface - 当用户停止输入文本时运行函数

windows - 为什么本地开发服务器无法使用 Yesod?