Error handling in context managers

Israel Brewster israel at ravnalaska.net
Tue Jan 17 13:59:16 EST 2017


On Jan 16, 2017, at 11:34 PM, Peter Otten <__peter__ at web.de> wrote:
>> Gregory Ewing wrote:
>>> Israel Brewster wrote:
>>> The problem is that, from time to time, I can't get a connection, the
>>> result being that cursor is None,
>>>> That's your problem right there -- you want a better-behaved
>> version of psql_cursor().
>>>> def get_psql_cursor():
>> c = psql_cursor()
>> if c is None:
>> raise CantGetAConnectionError()
>> return c
>>>> with get_psql_cursor() as c:
>> ...
>> You still need to catch the error -- which leads to option (3) in my zoo, 
> the only one that is actually usable. If one contextmanager cannot achieve 
> what you want, use two:
>> $ cat conditional_context_raise.py
> import sys
> from contextlib import contextmanager
>> class NoConnection(Exception):
> pass
>> class Cursor:
> def execute(self, sql):
> print("EXECUTING", sql)
>> @contextmanager
> def cursor():
> if "--fail" in sys.argv:
> raise NoConnection
> yield Cursor()
>> @contextmanager
> def no_connection():
> try:
> yield
> except NoConnection:
> print("no connection")
>> with no_connection(), cursor() as cs:
> cs.execute("insert into...")
> $ python3 conditional_context_raise.py
> EXECUTING insert into...
> $ python3 conditional_context_raise.py --fail
> no connection
>> If you want to ignore the no-connection case use 
> contextlib.suppress(NoConnection) instead of the custom no_connection() 
> manager.

Fun :-) I'll have to play around with that. Thanks! :-)
-----------------------------------------------
Israel Brewster
Systems Analyst II
Ravn Alaska
5245 Airport Industrial Rd
Fairbanks, AK 99709
(907) 450-7293
-----------------------------------------------
>> -- 
> https://mail.python.org/mailman/listinfo/python-list



More information about the Python-list mailing list

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