You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@thrift.apache.org by Neil Jensen <ne...@gmail.com> on 2011/07/31 01:33:44 UTC

haskell and exceptions

Hello, I'm running into problems using the haskell interface to thrift, specifically with exceptions.

The server code below correctly returns results under normal operation; however, when I throw an exception, either the client or the server is hanging.

instance IRRCalculator_Iface IRRCalculatorHandler where
    ping _ =
        print "ping()"

    portfolioIRR _ accounts enddate = do
        portirr <-  IRR.portfolioIRR accounts' enddate'
        case portirr of
            Nothing -> do
                print "no results found" 
                throw $ NoIRRresults { f_NoIRRresults_why = Just "No irr results"}
            Just x  -> do
                let (irrInfo,cfs') = fromJust portirr
                let cfs = map makeCashflow cfs'
                let irr' = makeIrr irrInfo cfs
                return irr'
        where accounts' = map (\x -> fromIntegral x) $ fromJust accounts
              enddate'  = fromIntegral $ fromJust enddate
 

Here is the client code that works:

main :: IO ()
main = do
    transport <- hOpen ("localhost", PortNumber port)
    let binProto = BinaryProtocol transport
    let client = (binProto, binProto)

    Client.ping client
    print "ping()"

    irr <- Client.portfolioIRR client [100042] 20110630
    print irr


Now when the client calls Client.portfolioIRR with arguments that will generate an exception, I do see the 'no results found' in the server log, but the client hangs:

    E.catch (do irr' <- Client.portfolioIRR client [10042] 20110630
                   print irr'
                 )
               (print "error")

Interestingly, even in ghci if I do irr' <- Client.portfolioIRR client [10042] 20110630 it hangs... so, I'm not sure if the server is not properly sending the exception, or if the client code is not dealing with it.

I haven't found any working examples of exception handling in haskell for Thrift... has anyone got it working?

Thanks in advance,
Neil