Haskell异常处理如何工作?

时间:2010-09-05 22:56:08

标签: exception haskell exception-handling

foldl1 (+) []

如何捕获结果错误?

3 个答案:

答案 0 :(得分:14)

纯代码可能会抛出异步imprecise exceptions,例如,当部分函数遇到输入时,它无法处理。

这些是逻辑错误,通常表示程序规范中的错误。

它们可能通过exception handler被IO代码(通常在程序的外层)捕获。

例如,要捕获空列表的遗漏案例,

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns        #-}

import Control.Exception

main = do
    handle (\(e :: SomeException) -> print $ "This program as a bug: " ++ show e) $ do
        let !v = foldl1 (+) ([] :: [Int])
        return ()

我们可以观察到异常被捕获,程序终止。

$ ./A
"This program as a bug: Prelude.foldl1: empty list"

答案 1 :(得分:6)

答案 2 :(得分:4)

纯粹答案:结果未定义(具体而言,bottom)。如果以任何方式使用该值来构建程序的结果,则除了崩溃之外,您无法执行任何操作。见Haskell 98 Report section 3.1。它指定这样的“错误导致程序立即终止,并且不能被用户捕获。”

最好检查输入值并在它们可以实现之前处理它们。如果列表可以包含0个元素,请不要使用fold1。

在实践中,您可以使用其他答案中的方法在使用GHC时在IO中捕获它。异常不能在纯(非IO)代码中捕获,因为引发异常是控制流的变化是副作用,而不是纯粹的计算。