Обработка исключения Python, которое возникает в предложении кроме - PullRequest
16 голосов
/ 21 января 2010

У меня есть некоторый код в предложении Python except, предназначенный для ведения некоторой регистрации, но сам код регистрации может вызвать исключение. В моем случае я хотел бы просто проигнорировать любое второе исключение и вызвать исходное исключение. Вот очень упрощенный пример:

try:
    a = this_variable_doesnt_exist
except:
    try:
        1/0
    except:
        pass
    raise

Запуск приведенного выше кода, я надеюсь получить:

NameError: name 'this_variable_doesnt_exist' is not defined

но вместо этого в Python 2.x я получаю:

ZeroDivisionError: integer division or modulo by zero

Я обнаружил, что в Python 3.x он делает то, что я хочу.

Я не смог найти много комментариев по этому поводу в документации по Python 2.x (если я не пропустил это). Могу ли я добиться этого в 2.x?

Ответы [ 3 ]

22 голосов
/ 21 января 2010

Я считаю, что то, что вы видите, является результатом цепочки исключений , которая является изменением в Python 3 .

Из раздела Мотивация ПКП:

При обработке одного исключения (исключение A) возможно возникновение другого исключения (исключение B). В сегодняшнем Python (версия 2.4), если это происходит, исключение B распространяется наружу, а исключение A теряется. Для устранения проблемы полезно знать об обоих исключениях. Атрибут __context__ сохраняет эту информацию автоматически.

Затем PEP подробно описывает новую цепочку исключений (которая реализована в Py3k) - это интересное чтение. Сегодня я узнал что-то новое.

17 голосов
/ 21 января 2010

С абстракцией:

def log_it():
    try:
        1 / 0
    except:
        pass

try:
    this = that
except:
    log_it()
    raise

Делает, что вы хотите в Python 2.5

Другой способ сделать это - сохранить исключение в переменной, а затем повторно вызвать его явно:

try:
    this = that
except NameError, e: # or NameError as e for Python 2.6
    try:
        1 / 0
    except:
        pass
    raise e

Обратите внимание, что вам, вероятно, не следует просто использовать голые except для перехвата всего, что может произойти - обычно лучше отлавливать конкретные исключения, которые вы ожидаете, в случае резкого и фатального исключения (например, нехватка памяти ) происходит.

0 голосов
/ 05 сентября 2012

В моем классе CausedException я позабочусь об этом для Python 2.x (и для Python 3 также, если вы хотите передать деревья причин вместо простых цепочек причин). Может быть, это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...