Error handling in context managers

Terry Reedy tjreedy at udel.edu
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 
FileNotFoundError.
> and attempting to use it results in an AttributeError.

Just as None.read 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

AltStyle によって変換されたページ (->オリジナル) /