[Haskell-beginners] AMQP and nested exception handlers

Alex alex323 at gmail.com
Tue May 12 02:11:04 UTC 2015


Hi:

I am writing a small application which receives HTTP requests,
translates them to JSON, and queues the requests using RabbitMQ.

I am using exceptions to handle extreme cases, such as when a client's
HTTP request lacks a critical header:

lookupHeader :: RequestHeaders -> HeaderName -> Text
lookupHeader hs h = decodeUtf8 $ fromMaybe notFound
                                           (lookup h hs)
  where
    notFound = throw $ MissingHeader $ decodeUtf8 $ original h

The problem I am running in to is that the header isn't actually looked
up until I call the AMQP library's publishMsg function. If I purposely
do not supply a critical header, I get the following error printed to
the screen: 

ConnectionClosedException "ConnectionClosedException \"UNEXPECTED_FRAME
- expected content header for class 60, got non content header frame
instead\""

If I add the following line just above the publishMsg function (to
force evaluation), my exception handler is called successfully:

print $ encode req

As a result, I suspect that this is due to the fact that the "throw
MissingHeader" is getting captured by the AMQP library. What's the best
way to deal with this situation?

-- 
Alex


More information about the Beginners mailing list