我已经读过Haskell实际上可能有运行时错误,尽管是静态类型和功能。但是,没有人说那些运行时错误。有人知道吗?
答案 0 :(得分:14)
标准库(base
包)抛出的所有运行时异常都在Control.Exception和GHC.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
当一个或多个进程永久被阻止时:BlockedIndefinitelyOnMVar
,Deadlock
等
当模式匹配失败时(主要在monad中):PatternMatchFail
断言失败时:AssertionFailed
以及更多。