0

我可以编写一个测试用例Test.HUnit来检查调用是否引发异常?

我只关心它是否抛出任何错误,不管它打印什么消息。

4

2 回答 2

2

这不是 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]
于 2016-12-13T18:01:54.357 回答
2

如果您的意思是“异常”并且它在某些代码Exception中被抛出,那么您可以使用or。但是,如果您的意思是在纯代码中捕获内容,那么您就不走运了。如果您愿意在 中进行处理,您有更多选择:IOcatchcatcheserror "Something bad happened" IO

ghci> import Control.Exception
ghci> catch (error "Eek") (\(ErrorCallWithLocation msg _) -> putStrLn msg) 
Eek

来自 Haskell 2010 报告第 3 节

Haskell 程序无法区分表达式求值过程中的错误,用 ⊥(“底部”)表示。

这是另一种思考方式:请注意,我们尝试评估 ⊥ (like error "Help!") 的值的时刻不取决于创建该值的时间,而仅取决于首次需要它的时间(因为 Haskell 是非严格的)。捕获此类错误的机制将破坏引用透明度。

于 2016-12-13T18:02:12.593 回答