Можно ли упростить вложенный блок try except в python

#python #try-catch

#python #попробуйте-catch

Вопрос:

все, мой код на python выглядит примерно так:

 try:
    foo1()
except FooError1:
    try:
        foo2()
    except FooError2:
        dosth()
raise raisesth()
  

Интересно, есть ли поддержка try-except для нескольких условий или составных условий в python, таким образом, мой код мог бы быть упрощен как:

 try:
    foo1() 
    foo2()
except FooError1 and FooError2:
    dosth()
raise raisesth()
  

Спасибо!

Комментарии:

1. Нет, это невозможно. Они выполняются foo2() в разных условиях.

Ответ №1:

Я предлагаю вам прочитать документацию по python.

Я предполагаю, что вы хотите dosth вызываться, если foo1() или foo2() возникает исключение, которое вы хотите обработать в dosth() , например, во втором блоке кода.

 try:
    foo1() 
    foo2()
except (FooError1, FooError2):
    dosth()
raise raisesth()
  

Поскольку вы можете задать and условие в своем except заявлении, я помню, что исключение должно обрабатываться сразу после его возникновения, иначе выполнение остановится, поэтому вы не можете сказать интерпретатору продолжать ждать, пока FooError2 придет…

Комментарии:

1. Это не имеет такого же поведения, как в первом примере.

2. @neurino: Это работает как или , не так ли? Он запрашивает и .

3. @Fenikso: понял, вы правы. Тогда я надеюсь, что OP объясняет, при каких именно условиях требуется dosth выполнение…

4. Всем спасибо! После того, как я проверил документ python, я понял, что except может содержать кортеж из нескольких условий. Это работает как условие или .

5. @demoslam — да, но он не будет вести себя так же, как вы написали в своем первом примере.

Ответ №2:

Исключение и ;-).

 def foo1():
    return 1/0

def foo2():
    return s

def do_something():
    print("Yes!")

def exception_and(functions, exceptions, do_something):
        try:
            functions[0]()
        except exceptions[0]:
            if len(functions) == 1:
                do_something()
            else:
                exception_and(functions[1:], exceptions[1:], do_something)

# ================================================================
exception_and([foo1, foo2], [ZeroDivisionError, NameError], do_something)

# Behaves the same as:

try:
    foo1()
except ZeroDivisionError:
    try:
        foo2()
    except NameError:
        do_something()
  

Комментарии:

1. Может быть упрощен с помощью zip() и for / else .