【问题标题】:Catching exceptions of multiple types捕获多种类型的异常
【发布时间】:2015-10-13 16:45:20
【问题描述】:

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

FormatError
QueryError
ResultError
SqlError

我想编写一个函数来捕获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) }

这不起作用。 try 没有捕捉到任何东西。如何捕获 4 种异常类型中的任何一种,并根据类型将其映射到 ServantErr,但仍允许我无法处理的任何异常通过?

【问题讨论】:

    标签: postgresql haskell exception


    【解决方案1】:

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

    postgresErr :: SomeException -> ServantErr
    

    (理想情况下,postgresql-simple 可以添加自己的中间包罗万象的异常类型供您使用,但我看不到任何异常类型。)

    如果你想准确地捕捉这四个,我知道的最好方法是使用catches 函数:

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

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

    【讨论】:

    • 如果我只想在它们是这 4 种类型之一的情况下捕获它们怎么办?
    • @SeanClarkHess 添加了一些关于此的内容。
    猜你喜欢
    • 2012-01-16
    • 2014-02-14
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多