Python с заявлением, продолжить

Я разрабатываю программу на Python и достиг точки, которую я не знаю, как решить. Мое намерение состоит в том, чтобы использовать with заявление, избегайте использования try/ исключением.

Пока что моя идея заключается в возможности использовать continue заявление, как оно будет использоваться внутри except, Тем не менее, я не вижу успеха.

Давайте предположим, что это мой код:

def A(object):
    def __enter__:
        return self

    def __exit__:
        return True

with A():
    print "Ok"
    raise Exception("Excp")
    print "I want to get here"

print "Outside"

Читая документы, я обнаружил, что возвращая True внутри __exit__ метод, я могу предотвратить прохождение исключения, как с pass заявление. Тем не менее, это сразу пропустит все, что осталось сделать в with, чего я стараюсь избегать, так как хочу, чтобы все выполнялось, даже если возникло исключение.

До сих пор я не смог найти способ сделать это. Любой совет будет принят во внимание. Большое спасибо.

3 ответа

Решение

Это невозможно.

Единственными двумя вариантами являются: (а) разрешить распространение исключения путем возврата значения false-y или (б) проглотить исключение путем возврата значения True. Невозможно возобновить блок кода, из которого было сгенерировано исключение. В любом случае, ваш with блок окончен

Ты не можешь with Цель оператора состоит в том, чтобы обрабатывать очистку автоматически (именно поэтому исключения могут подавляться при выходе из него), а не действовать как печально известная Visual Basic On Error Resume Next,

Если вы хотите продолжить выполнение блока после возникновения исключения, вам нужно обернуть все, что вызывает исключение, в try/except заявление.

Хотя большинство ответов верны, боюсь, ни один из них не подходит моей проблеме (я знаю, что не предоставил весь свой код, извините за это).

Я решил проблему, используя другой подход. Я хотел иметь возможность обрабатывать NameError ("переменная не объявлена") внутри With. Если это произошло, я бы заглянул в свой объект для этой переменной и продолжил.

Сейчас я использую globals() для объявления переменной. Это не самое лучшее, но на самом деле это работает, и давайте продолжим, так как никаких исключений не происходит.

Спасибо вам всем!

Другие вопросы по тегам