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() для объявления переменной. Это не самое лучшее, но на самом деле это работает, и давайте продолжим, так как никаких исключений не происходит.
Спасибо вам всем!