Your issue is related to Lazy evaluation. Your function (lookupHeader) isn't actually evaluated before you call publishMsg or print. You need to put seq or deepseq to overcome this, or put your exception handler in place when your function is actually evaluated. Unfortunately, you haven't provided the calling code, so I have no specific suggestion. Just read some info on Lazy vs. Strict.

Parallel and Concurrent Programming in Haskell Chapter 2 [1] has a good description (just skip "The Eval Monad, rpar, and rseq" section and continue with deepseq).
Here is a good chapter on exception [2], if you need one.

[1]: http://chimera.labs.oreilly.com/books/1230000000929/ch02.html
[2]: http://chimera.labs.oreilly.com/books/1230000000929/ch08.html#sec_exceptions

On Tue, May 12, 2015 at 5:11 AM Alex <alex323@gmail.com> wrote:
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
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners