当我查询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
,但是仍然允许我不处理的任何异常通过?
答案 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
(尽管他们的类型签名可能只有不同)。