Haskell 会出现哪些类型的运行时错误?
What kinds of runtime errors can Haskell have?
我读到 Haskell 实际上可能会出现运行时错误,尽管它是静态类型和功能性的。但是,没有人说 可能是什么 运行时错误。有人知道吗?
标准库(base
包)可能抛出的所有运行时异常都在 Control.Exception and GHC.Exception.
中定义
error
是GHC.Err中定义的函数(基于GHC.Exception)如
error :: [Char] -> a
error s = raise# (errorCallException s)
如果某些处理程序未捕获到 ErrorCall
异常,它会抛出一个 ErrorCall
异常并将错误消息打印到 stderr,大多数 run-time 异常是由 base
中的纯函数引发的由 error
.
实施
几个例子:
undefined
,代码尚未实现的占位符,定义为
undefined :: a
undefined = error "undefined"
由于它的类型,它将通过编译步骤,并且在 run-time 处计算时会引发异常。
由于历史原因,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
= Whosebug
| HeapOverflow
| ThreadKilled
| UserInterrupt
当计算显然不会终止时:NonTermination
当一个或多个进程永远阻塞时:BlockedIndefinitelyOnMVar
, Deadlock
,等等
当模式匹配失败时(主要在 monad 中):PatternMatchFail
当断言失败时:AssertionFailed
还有很多很多。
我读到 Haskell 实际上可能会出现运行时错误,尽管它是静态类型和功能性的。但是,没有人说 可能是什么 运行时错误。有人知道吗?
标准库(base
包)可能抛出的所有运行时异常都在 Control.Exception and GHC.Exception.
error
是GHC.Err中定义的函数(基于GHC.Exception)如
error :: [Char] -> a
error s = raise# (errorCallException s)
如果某些处理程序未捕获到 ErrorCall
异常,它会抛出一个 ErrorCall
异常并将错误消息打印到 stderr,大多数 run-time 异常是由 base
中的纯函数引发的由 error
.
几个例子:
undefined
,代码尚未实现的占位符,定义为
undefined :: a
undefined = error "undefined"
由于它的类型,它将通过编译步骤,并且在 run-time 处计算时会引发异常。
由于历史原因,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
= Whosebug
| HeapOverflow
| ThreadKilled
| UserInterrupt
当计算显然不会终止时:NonTermination
当一个或多个进程永远阻塞时:BlockedIndefinitelyOnMVar
, Deadlock
,等等
当模式匹配失败时(主要在 monad 中):PatternMatchFail
当断言失败时:AssertionFailed
还有很多很多。