[Haskell-cafe] Problem about exception.
Magicloud Magiclouds
magicloud.magiclouds at gmail.com
Thu Jan 27 04:02:10 CET 2011
On Thu, Jan 27, 2011 at 11:00 AM, Magicloud Magiclouds
<magicloud.magiclouds at gmail.com> wrote:
> On Thu, Jan 27, 2011 at 10:48 AM, Brandon S Allbery KF8NH
> <allbery.b at gmail.com> 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] allbery at kf8nh.com
>> system administrator [openafs,heimdal,too many hats] allbery at 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 at 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.
>
> --
> 竹密岂妨流水过
> 山高哪阻野云飞
>
Sorry, in last mail, I meant, in really wrong situation, there might
be other tens of unexpected command, I'd like to wrap them in one
exception, other than making tens of exceptions.
--
竹密岂妨流水过
山高哪阻野云飞
More information about the Haskell-Cafe
mailing list