valpackett / magicbane

A web framework that integrates Servant, EKG, fast-logger, wai-cli… | now on https://codeberg.org/valpackett/magicbane

Home Page:https://codeberg.org/valpackett/magicbane

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Exception Handling

jeremyjh opened this issue · comments

In my application, I would like for the Wai Logger middleware to write a message to the log when an unhandled exception occurs and 500 response is sent to the client. For this to happen, it looks we need to catch that exception and respond inside our Application. A basic example of how this would be done in servant is

app :: Application
app = serve api $ hoistServer api nt server

nt :: Handler a -> Handler a
nt = handleAny throwEx
    where
      throwEx e = throwError $ err500 {errBody = "The following server exception occured: " <> (cs $ show e)}

How can I do the same thing using magicbaneApp ? Or is this something magicbane could do?

Right now, you can write your own magicbaneApp to compose your nt with runMagicbaneHandler c. I'll look into adding an argument to remove the need for duplicating the function :)

Thanks, I think it would be great if Magicbane had options for this. If it wired up request logging out of the box that would be great too. I ended up writing a small middleware for now:

exceptionResponder :: AppContext -> Middleware
exceptionResponder ctx next request respond =
    next request respond `catch` \(exception :: SomeException) -> do
        runRIO ctx $ logError $ "Unhandled exception: " <> display exception
        respond $
            responseLBS
                status500
                [("Content-Type", "application/json")]
                "{\"message\": \"An error has occurred.\"}"