Обработка исключений в рамках исключения - PullRequest
0 голосов
/ 15 марта 2020

Итак, у меня есть следующие два разных блока try-кроме, где я не понимаю вывод, и я полагаю, что это из-за исключений внутри, кроме блоков. Несмотря на то, что я нашел несколько вопросов с похожим названием, они не помогли мне ответить на мой вопрос.

Первый блок:

try:
    try:
        raise IndexError
        x = 5/0
    except ArithmeticError:
        print("1")
        print("2")
    except IndexError:
        print("3")
    finally:
        print("4")
except:
    print("5")                #Output: 3 4

Поскольку мы поймали IndexError, почему возникает последнее исключение 5 ? ( Я понимаю, что raise IndexError перехватывается вторым, за исключением того, что мы получаем 3 , и с наконец всегда выполняется , 4 распечатывается также ).

Второй (связанный) Вопрос:

try:
    try:
        x = 5/0
    except ArithmeticError:
        print("1")
        raise IndexError            # this is different this time!
        print("2")
    except IndexError:
        print("3")
    finally:
        print("4")
except:
    print("5")                      #Output: 1 4 5

Как получается, что raise IndexError не выполняет оператор print("3")? И почему мы получаем вывод 5 на этот раз, так как мы не получили его в первом примере?

1 Ответ

1 голос
/ 15 марта 2020

except будет ловить исключения, выданные в try, но , а не в других соседних except блоках. Для любого данного try с несколькими соседними except блоками один из этих except блоков будет обрабатывать исключение.

В вашем первом примере 5 не печатается, потому что код во внешнем try не вызывает исключения. Исключение во внутреннем try генерируется и обрабатывается одним из блоков except на этом уровне.

Во втором примере 3 не печатается, поскольку код в try блок не выбрасывает IndexError. Выдает ArithmeticError, который перехватывается соответствующим блоком except. Этот блок также генерирует исключение, которое существует во всей структуре try/except и попадает в блок более высокого уровня except.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...