
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
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