Haskell可以有哪些运行时错误?

时间:2016-01-18 06:00:02

标签: haskell runtime-error

我已经读过Haskell实际上可能有运行时错误,尽管是静态类型和功能。但是,没有人说那些运行时错误。有人知道吗?

1 个答案:

答案 0 :(得分:14)

标准库(base包)抛出的所有运行时异常都在Control.ExceptionGHC.Exception中定义。

error是GHC.Err中定义的函数(基于GHC.Exception)

error :: [Char] -> a
error s = raise# (errorCallException s)

如果某个处理程序没有捕获,它抛出ErrorCall异常并向stderr输出错误消息,base中纯函数引发的大多数运行时异常都被实现error

一些例子:

undefined是尚未实现的代码的占位符,定义为

undefined :: a
undefined = error "undefined"

由于它的类型,它将通过编译步骤,并在运行时进行评估时会引发异常。

GHC标准库出于历史原因导出一些部分功能,例如: head

head                    :: [a] -> a
head (x:_)              =  x
head []                 =  badHead

badHead :: a
badHead = errorEmptyList "head"

errorEmptyList :: String -> a
errorEmptyList fun =
    error (prel_list_str ++ fun ++ ": empty list")

IOException总结了您在其他编程语言中可能遇到的大多数普通IO异常,例如FileNotFound,NoPermission,UnexpectedEOF等。它在System.IO.Error中进一步扩展,仅在IO monad的上下文中抛出。

base中有六个算术例外,它们是

data ArithException
  = Overflow
  | Underflow
  | LossOfPrecision
  | DivideByZero
  | Denormal
  | RatioZeroDenominator

两个数组访问异常,它们是:

data ArrayException
  = IndexOutOfBounds    String
  | UndefinedElement    String

四个异步异常,即设计为在进程之间传递的异常,它们是:

data AsyncException
  = StackOverflow
  | HeapOverflow
  | ThreadKilled
  | UserInterrupt

当计算显然不会终止时:NonTermination
当一个或多个进程永久被阻止时:BlockedIndefinitelyOnMVarDeadlock等 当模式匹配失败时(主要在monad中):PatternMatchFail
断言失败时:AssertionFailed

以及更多。