[英]Unit testing for exceptions
我可以用Test.HUnit
编写一个测试用例来检查调用是否引发异常吗?
无论打印什么消息,我都只关心它是否引发任何错误。
这不是特定于HUnit,但是您可以编写一个函数来检查IO
值是否抛出:
λ> :set -XScopedTypeVariables
λ> import Control.Exception
λ> import Data.Functor
λ> import System.Environment
λ> throws io = catch (io $> False) $ \(e :: SomeException) -> pure True
throws :: IO a -> IO Bool
λ> sequence $ throws <$> [ getEnv "HOME", getEnv "whatever", error "a" ]
[False,True,True]
如果“异常”是指Exception
并且它正在某些IO
代码中引发,则可以使用catch
或catches
。 但是,如果您要用纯代码捕获诸如error "Something bad happened"
,那么您就不走运了。 如果您愿意在IO
进行处理,则有更多选择:
ghci> import Control.Exception
ghci> catch (error "Eek") (\(ErrorCallWithLocation msg _) -> putStrLn msg)
Eek
在Haskell 2010报告第3部分中 :
Haskell程序将表达式评估过程中的错误用⊥(“底部”)表示,与未终止是无法区分的。
这是另一种思考方式:请注意,我们尝试评估⊥值的时间(例如error "Help!"
)不取决于创建此值的时间,而仅取决于首次使用它的时间(因为Haskell不是-严格)。 捕获此类错误的机制将破坏参照透明性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.