Search code examples
pythonwith-statementcontextmanager

Understanding the Python with statement and context managers


I am trying to understand the with statement. I understand that it is supposed to replace the try/except block.

Now suppose I do something like this:

try:
   name = "rubicon" / 2  # to raise an exception
except Exception as e:
   print("No, not possible.")
finally:
   print("OK, I caught you.")

How do I replace this with a context manager?


Solution

  • with doesn't really replace try/except, but, rather, try/finally. Still, you can make a context manager do something different in exception cases from non-exception ones:

    class Mgr(object):
        def __enter__(self): pass
        def __exit__(self, ext, exv, trb):
            if ext is not None: print "no not possible"
            print "OK I caught you"
            return True
    
    with Mgr():
        name='rubicon'/2 #to raise an exception
    

    The return True part is where the context manager decides to suppress the exception (as you do by not re-raising it in your except clause).