snoyberg / conduit

A streaming data library
902 stars 194 forks source link

bracketP with custom monad stack #489

Open emlautarom1 opened 2 years ago

emlautarom1 commented 2 years ago

I have the following function:

withPostgreSQL :: MonadResource m => ByteString -> (SQL.Connection -> ConduitT i o m r) -> ConduitT i o m r
withPostgreSQL cs f = bracketP (SQL.connectPostgreSQL cs) SQL.close f

I would like to catch any exception that connectPostgreSQL throws and log it using monad-logger, something like:

withPostgreSQL cs f = (bracketP (SQL.connectPostgreSQL cs) SQL.close f) `catch` (\(e :: IOException) -> $(logError) (show e))

Now it seems that I can't do that since catch from base is fixed to IO. Using catch from unliftIO requires ConduitT to have an instance of MonadUnliftIO. After trying stuff for a while I just gave up.

My question would be "how do I log that bracketP failed using monad-logger"?

snoyberg commented 2 years ago

You can't do that. You would need to do the exception handling inside the arguments to bracketP.