Yield inside try...finally

Alan Kennedy alanmk at hotmail.com
Tue Jun 3 19:12:35 CEST 2003


Michael Sparks wrote:
> 
> I've been working with wrapping up network client functionality as a
> generator recently, and hit a "niceness"/"cleanness" speedbump.
> 
> What I'd *like* to do (which doesn't work) is:
> 
> try:
>    sock = socket(AF_INET, SOCK_STREAM);
>    try:
>       sock.setblocking(0); yield stage.done(0)
>       try:
>          sock.connect((self.host, self.port)); yield stage.done(1)
>          yield newComponent([self.setupCSA(sock)])
>          while self.waitCSAClose():
>             yield stage.current(2)
>          yield stage.done(2)
>       finally:
>          result = s.shutdown(1) ; yield stage.done(3)
>    finally:
>       sock.close() ; yield stage.done(4)
> except error, e:
>    # Would handle error more interestingly here
>    print stage.lastdone, e

Hope this doesn't offend your programming sensibilities ;-) I haven't decided
yet if it offends mine.

#------------------------------

class Finality(Exception): pass

try:                                                              
   sock = socket(AF_INET, SOCK_STREAM);                           
   try:                                                           
      sock.setblocking(0); yield stage.done(0)
      try:
         sock.connect((self.host, self.port)); yield stage.done(1)
         yield newComponent([self.setupCSA(sock)])
         while self.waitCSAClose():                               
            yield stage.current(2)                                
         yield stage.done(2)
         raise Finality
      except Finality:                                                    
         result = s.shutdown(1) ; yield stage.done(3)
         raise Finality
   except Finality:                                                       
      sock.close() ; yield stage.done(4)
      raise Finality
except error, e:
   # Would handle error more interestingly here
   print stage.lastdone, e
except Finality:
   pass




-- 
alan kennedy
-----------------------------------------------------
check http headers here: http://xhaus.com/headers
email alan:              http://xhaus.com/mailto/alan




More information about the Python-list mailing list