At 10:00 AM 5/11/2005 -0700, Guido van Rossum wrote:
>(3) Full exception information, with the understanding that when
>__exit__() returns normally, exception processing will resume as usual
>(i.e. __exit__() is called from a finally clause). Exceptions raised
>from __exit__() are considered errors/bugs in __exit__() and should be
>avoided by robust __exit__() methods.

FYI, there are still use cases for clearing the exception state in an 
__exit__ method, that might justify allowing a true return from __exit__ to 
suppress the error.  e.g.:


     class Attempt(object):
         def __init__(self,type,last=False):
             self.type = type
             self.last = last
         def __enter__(self): pass
         def __exit__(self,*exc):
             if exc and not last and issubclass(exc[0],self.type):
                 # suppress exception
                 return True

     def retry(count, type=Exception):
         attempt = Attempt(type)
         for i in range(count-1):
             yield attempt
         yield Attempt(type, True)

     # usage:

     for attempt in retry(3):
         do attempt:
            somethingThatCouldFail()

and:

     class logging_exceptions(object):
         def __init__(self,logger): self.logger = logger
         def __enter__(self): pass
         def __exit__(self,*exc):
             if exc:
                 # log and suppress error
                 self.logger.error("Unexpected error", exc_info=exc)
                 return True

     while True:
         do logging_exceptions(my_logger):
             processEvents()

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to