Как продолжить со следующей строки в блоке попыток Python?

#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, поэтому лучше всего использовать отдельный обработчик исключений для каждой функции.