Перехват исключительной ситуации при открытии ключевого слова "with" - PullRequest
0 голосов
/ 30 апреля 2018

Для конкретного примера, возьмите psycopg2 для Postgres (я знаю, mysql.connection имеет похожий API):

try:
    with closing(connection.cursor()) as cursor:
        ... # run a transaction with cursor, like insert
except IntegrityError as e:
    cursor.rollback()

сможет ли курсор откатиться в этом случае или ресурс курсора будет закрыт до того, как откат произойдет в этом случае?

1 Ответ

0 голосов
/ 30 апреля 2018

Можете ли вы поменять местами try: и with ...?

with closing(connection.cursor()) as cursor:
    try:
        ... # run a transaction with cursor, like insert
    except IntegrityError as e:
        cursor.rollback()

Таким образом, курсор будет находиться в текущей области видимости при достижении except ...:.

С вашим кодом при достижении except ...: cursor будет None.

...