Error handling in context managers

Terry Reedy tjreedy at
Mon Jan 16 17:27:56 EST 2017

On 1/16/2017 1:06 PM, Israel Brewster wrote:
> I generally use context managers for my SQL database connections, so I can just write code like:
> with psql_cursor() as cursor:
>     <do whatever>
> And the context manager takes care of making a connection (or getting a connection from a pool, more likely), and cleaning up after the fact (such as putting the connection back in the pool), even if something goes wrong. Simple, elegant, and works well.
> The problem is that, from time to time, I can't get a connection, the result being that cursor is None,

This would be like open('bad file') returning None instead of raising 

> and attempting to use it results in an AttributeError.

Just as would.

Actually, I have to wonder about your claim.  The with statement would 
look for cursor.__enter__ and then cursor.__exit__, and None does not 
have those methods.  In other words, the expression following 'with' 
must evaluate to a context manager and None is not a context manager.

 >>> with None: pass

Traceback (most recent call last):
   File "<pyshell#3>", line 1, in <module>
     with None: pass
AttributeError: __enter__

Is psql_cursor() returning a fake None object with __enter__ and 
__exit__ methods?

Terry Jan Reedy

More information about the Python-list mailing list