说我有像ExitFailure
这样的例外。如何匹配处理程序中ExitFailure
的不同值?
import System.Exit (ExitCode(..))
import Control.Monad.Catch as Exc
value :: Either Exc.SomeException String
value = Exc.throwM . ExitFailure $ 23
valHandler :: Exc.SomeException -> Either Exc.SomeException String
valHandler e = ??
main = print $ Exc.catch value valHandler
我知道valHandler e = someValue
会匹配任何类型的异常,但我从未见过一个例子,它与异常类型匹配。
我无法使用模式匹配,因为我手上有SomeException
,我无法使用等式检查,因为SomeException
没有{ {1}}实例?
答案 0 :(得分:1)
Exception
类提供了一种方法:
fromException :: SomeException -> Maybe e
您可以使用它来恢复异常。
valHandler :: Exc.SomeException -> Either Exc.SomeException String
valHandler e
| Just (ExitFailure code) <- fromException e
= Right ...
| otherwise = Left e