[英]What kinds of runtime errors can Haskell have?
我已经读过Haskell实际上可以有运行时错误,尽管是静态类型和功能。 但是,没有一个人说,这些可能是什么运行时错误。 谁知道?
标准库( base
包)抛出的所有运行时异常都在Control.Exception和GHC.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
当一个或多个进程永远被阻止时: BlockedIndefinitelyOnMVar
, Deadlock
等。
模式匹配失败时(主要在monad中): PatternMatchFail
当一个断言失败: AssertionFailed
还有更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.