#python #exception
#python #исключение
Вопрос:
например
try:
foo()
bar()
except:
pass
Когда функция foo вызывает исключение, как перейти к следующей строке (строке) и выполнить ее?
Ответ №1:
Извлеките bar()
из try
блока:
try:
foo()
except:
pass
bar()
Кстати, следите за предложениями catch-all. except
Предпочитайте выборочно перехватывать исключения, которые, как вы знаете, вы можете обрабатывать / игнорировать.
Комментарии:
1. Лучшей формой простого исключения было бы
except Exception:
, поскольку это не будет перехватывать такие вещи, как KeyboardInterrupt или SystemExit. Так что, если бы это застряло в узком цикле, вы все равно могли бы вырваться с помощью ^C.
Ответ №2:
Если у вас есть только две функции, foo() bar() , проверьте другие решения. Если вам нужно выполнить МНОГО строк, попробуйте что-то вроде этого примера:
def foo():
raise Exception('foo_message')
def bar():
print'bar is ok'
def foobar():
raise Exception('foobar_message')
functions_to_run = [
foo,
bar,
foobar,
]
for f in functions_to_run:
try:
f()
except Exception as e:
print '[Warning] in [{}]: [{}]'.format(f.__name__,e)
Результат:
[Warning] in [foo]: [foo_message]
bar is ok
[Warning] in [foobar]: [foobar_message]
Ответ №3:
Невозможно выполнить, если вызов bar
находится внутри try
-block . Либо вы должны поместить вызов за пределы блока try-except, либо использовать else
:
try:
foo()
except:
pass
else:
bar()
Если bar
также может возникнуть исключение, вы должны использовать отдельный try
блок для bar
.
Ответ №4:
Это не предполагаемый способ использования блоков try / except. Если bar()
должно выполняться, даже если foo()
сбой, вы должны поместить каждый в свой собственный блок try / except:
try:
foo()
except:
pass # or whatever
try:
bar()
except:
pass # or whatever
Ответ №5:
Если вы хотите, чтобы исключения из обеих функций обрабатывались одним и тем же предложением except , используйте внутренний блок try / finally:
try:
try:
foo()
finally:
bar()
except Exception:
print 'error'
Если есть исключение foo()
, сначала bar()
будет выполнено, затем предложение except .
Однако, как правило, рекомендуется помещать минимальный объем кода внутри блока try, поэтому лучше всего использовать отдельный обработчик исключений для каждой функции.