On Thu, Jan 27, 2011 at 10:48 AM, Brandon S Allbery KF8NH <[email protected]> wrote: > -----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] [email protected] > system administrator [openafs,heimdal,too many hats] [email protected] > 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 > [email protected] > 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. -- 竹密岂妨流水过 山高哪阻野云飞 _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
