Как отловить исключение, которое уже было перехвачено вызовом вложенной функции в Python - PullRequest
0 голосов
/ 11 июня 2019

В следующем примере я хотел бы иметь возможность вызвать функцию b() из a(), а для a() распознать, что IndexError произошло в b().

def a():
    try:
        b()
    except IndexError:
        print('Caught the error in a!')

def b():
    array = ["First", "Second"]

    try:
        print(array[2])
    except IndexError:
        print('Caught the error in b!')

a()

Вывод этого скрипта выглядит следующим образом:

Caught the error in b!

Я хотел бы увидеть, как этот скрипт может вывести следующее:

Caught the error in b!
Caught the error in a!

Я бы очень хотелпредпочитаю ответ с ограничением, что в функцию a() вносятся изменения только для конкретного сценария реального мира, с которым я на самом деле имею дело, но приму другой ответ, если это невозможно.

My(неверно) интуиция предполагает, что сценарий просто завершается после того, как исключение перехвачено в b(), но следующий пример доказывает, что это не так:

def a():
    try:
        b()
    except IndexError:
        print('Caught the error in a!')
    print('Both chances are over now.')

def b():
    array = ["First", "Second"]

    try:
        print(array[2])
    except IndexError:
        print('Caught the error in b!')

a()

Этот сценарий выведет следующее:

Caught the error in b!
Both chances are over now.

Что доказывает мне, что функция a() продолжит выполняться после возникновения исключения IndexError в b().

Ответы [ 2 ]

1 голос
/ 11 июня 2019
def a():
    try:
        b()
    except IndexError:
        print('Caught the error in a!')
    print('Both chances are over now.')

def b():
    array = ["First", "Second"]

    try:
        print(array[2])
    except IndexError:
        print('Caught the error in b!')
        raise

a()
0 голосов
/ 11 июня 2019

Используйте <exception> as e и raise <exception> from e:

def a():
    try:
        b()
    except IndexError:
        print('Caught the error in a!')
    print('Both chances are over now.')

def b():
    array = ["First", "Second"]

    try:
        print(array[2])
    except IndexError as e:
        raise IndexError('Caught the error in b!') from e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...