我想创建一个函数,当一个函数引发任何类型的异常时返回True
,否则返回False
。
但是我无法找到一种方法,可以使用catch
上的Control.Exception
方法。
我想捕获[1,2] !! 3
引发的错误,还希望捕获因error "Error msg"
的使用而引发的自定义错误。
答案 0 :(得分:9)
您可以按以下方式使用catch
:
example :: IO ()
example = do
let handler :: SomeException -> IO Bool
handler e = do
putStrLn "Exception caught:"
print e
return False
res <- (evaluate ([1,2::Int] !! 3) >> return True) `catch` handler
print res
最后一个print
将在正常终止时打印True
,在异常终止时将打印False
。
可以删除处理程序中的输出消息-仅用于说明。
如果您只想捕获某些异常类型,则可以将SomeException
替换为任何更具体的异常类型。
请注意,您无法在IO之外捕获异常,这使它们更加受限制。因此,应避免使用!!
之类的部分函数,而应首选返回Maybe a
类型的函数,该函数的输出可在任何地方检查。