捕获多种类型的异常

时间:2015-10-13 16:45:21

标签: postgresql haskell exception

当我查询my database时,它可能会抛出one of four different kinds of exceptions

In child 15930
In child 15929
In child 15928
Child 15930 is dead with exit status 5
Child 15930 is dead with exit status 5
Child 15930 is dead with exit status 5

我想编写一个函数来捕获FormatError QueryError ResultError SqlError 生成的4个异常中的任何一个,并将它们提升为query

ExceptT

这不起作用。 runQuery :: (ToRow q, FromRow r) => Query -> q -> ExceptT ServantErr IO [r] runQuery conn q sub = do res <- liftIO $ try $ Postgres.query conn q sub case res of Left err -> throwError (postgresErr err) Right r -> return r postgresErr :: ??? -> ServantErr postgresErr e = err500 { errBody = ByteString.pack (show e) } 没有抓到任何东西。我如何捕获4种异常类型中的任何一种,并根据类型将其映射到try,但是仍然允许我不处理的任何异常通过?

1 个答案:

答案 0 :(得分:6)

GHC的Exception class forms a hierarchy,其中SomeException类型位于顶部。因此,要捕获任何异常,请使用:

postgresErr :: SomeException -> ServantErr

(理想情况下postgresql-simple可以添加自己的中间catch-all异常类型,但是我看不到任何异常类型。)

如果您想要完全那四个,我知道的最好方法是使用catches函数:

catches :: IO a -> [Handler a] -> IO a

不幸的是,这要求您为每个人提供一个Handler(尽管他们的类型签名可能只有不同)。