
On Thu, Jan 27, 2011 at 10:48 AM, Brandon S Allbery KF8NH
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 1/26/11 21:10 , Magicloud Magiclouds wrote:
Hi, Consider such a case: I'm making a client program. There is a process, client and server exchange some information in a strict order. So I do (persudo code): exchange = do sendHello readMsg >>= expect hello processHelloReply sendWhatsyourname readMsg >>= expect name processNameReply
And expect is something like: expect c f (cmd, msg) = if c == cmd then f msg else fail "unexpected"
This is OK until this situation: The server may send some special command, for example DEBUG, DISCONNECT. This breaks the process above. So I think I could throw the unexpected command to outer function to handle. Something like: main = do connect catch exchange $ \e -> do case e of UnexpectedCMD DEBUG -> -- ignore process UnexpectedCMD DISCONNECT -> -- disconnect process _ -> -- something really wrong
Well, with Control.Exception, I do not know how to make this done.
It looks to me like the very example in the Control.Exception documentation will do this, with some renaming.
-- many languages call this a "control exception"; think break/next -- etc. It's an exception used internally to modify control flow. data ControlException = CEDebug | CEDisconnect deriving (Show, Typeable)
instance Exception ControlException
So now you can trap your ControlException above, or anything else is presumably a true exception.
- -- brandon s. allbery [linux,solaris,freebsd,perl] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (Darwin) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk1A3RgACgkQIn7hlCsL25XRMgCeNEImC8VWPiM0fHB5Bu2ooFc8 nz8An0TwHXXUxJl7bhndSVf2vxWbXpGf =HIqR -----END PGP SIGNATURE-----
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
This is one way. But so the outer function could not know what happened in "really wrong" situation. -- 竹密岂妨流水过 山高哪阻野云飞