繁体   English   中英

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

[英]What kinds of runtime errors can Haskell have?

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

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

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

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

如果没有被某个处理程序ErrorCall它会抛出一个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

还有更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM