我可以编写一个测试用例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
中被抛出,那么您可以使用or。但是,如果您的意思是在纯代码中捕获内容,那么您就不走运了。如果您愿意在 中进行处理,您有更多选择: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 程序无法区分表达式求值过程中的错误,用 ⊥(“底部”)表示。
这是另一种思考方式:请注意,我们尝试评估 ⊥ (like error "Help!"
) 的值的时刻不取决于创建该值的时间,而仅取决于首次需要它的时间(因为 Haskell 是非严格的)。捕获此类错误的机制将破坏引用透明度。