Sea*_*ess 2 postgresql haskell exception
当我查询我的数据库时,它可能会抛出四种不同的异常中的一种.
FormatError
QueryError
ResultError
SqlError
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数来捕获由query它们生成的4个异常中的任何一个并将它们提升到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) }
Run Code Online (Sandbox Code Playgroud)
这不起作用.try没有抓到任何东西.如何捕获4种异常类型中的任何一种,并ServantErr根据类型将其映射到a ,但是仍然允许我不处理的任何异常通过?
GHC的Exception类形成一个层次结构,SomeException类型位于顶部.因此,要捕获任何异常,请使用:
postgresErr :: SomeException -> ServantErr
Run Code Online (Sandbox Code Playgroud)
(理想情况下postgresql-simple可以添加它自己的中间catch-all异常类型,你可以使用,但我看不到任何.)
如果你想准确地捕捉那四个,我知道的最好方法是使用这个catches功能:
catches :: IO a -> [Handler a] -> IO a
Run Code Online (Sandbox Code Playgroud)
不幸的是,这要求你Handler为每个人提供一个(尽管他们的类型签名可能只有不同).
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |