попробуйте / кроме возврата в python

Предостережения при использовании return с try / за исключением Python

Поведение возврата с помощью try / except в Python

Примечание. Для лиц, не являющихся участниками, эта статья доступна по адресу https://dineshkumarkb.com/tech/caveats-of-using-return-with-try-except-in-python/

Код пользователя может вызывать встроенные исключения. Python определяет try / except для обработки исключений и продолжения дальнейшего выполнения программы без прерывания.

Давайте быстро перейдем к примеру простого предложения try / except.

try / except операторы

Предполагая, что файл недоступен, выполнение приведенного ниже кода даст результат, как показано ниже.

try:
    f = open("testfile.txt")
    ...
except FileNotFoundError as e:
    print(f" Error while reading file {e} ")
Output:
Error while reading file [Errno 2] No such file or directory: 'testfile.txt'

В практических случаях использования, таких как подключение к базе данных или открытие файлового объекта, нам может потребоваться выполнить операции разрыва, такие как закрытие базы данных / закрытие файла, независимо от того, выполняется ли блок. Итак, finally - один из таких блоков, который можно зарезервировать для этих операций, поскольку он всегда выполняется. Давайте посмотрим на пример.

операторы try / except / finally

try:
    f = open("testfile.txt")
except FileNotFoundError as e:
    print(f" Error while reading file {e} ")
finally:
    print(" Closing the file ")
    f.close()

Так что же здесь могло пойти не так? Почему мы должны быть осторожными?

Что ж, можно легко поставить ногу им в рот, когда они используют операторы return с try / except / finally в Python. Давайте внимательно сделаем шаг за шагом, чтобы понять использование операторов return во время обработки исключений.

1. Использование return с try / except

def test_func():
    try:
        x = 10
        return x
    except Exception as e:
        x = 20
        return x
    finally:
        x = 30
        return x
print(test_func())
Output:
30

Если вы думаете, что вывод приведенного выше кода равен 10, боюсь, вы ошибаетесь. Это предположение вполне нормально, потому что мы склонны думать, что в тот момент, когда в функции есть оператор return, он возвращает (выходит) из функции. Что ж, в данном случае это может быть неверно.

Из документов,

  • Если присутствует предложение finally, предложение finally будет выполняться как последняя задача перед завершением оператора try. Предложение finally выполняется независимо от того, вызывает ли оператор try исключение.
  • Если оператор try достигает оператора break, continue или return, предложение finally будет выполняться непосредственно перед выполнением оператора break, continue или return.
  • Если предложение finally включает оператор return, возвращаемое значение будет значением из оператора return предложения finally, а не значением из оператора return предложения try/except.

Итак, как вы правильно догадались, на выходе приведенного выше кода будет 30.

Теперь, что происходит, если в вышеупомянутом коде возникает исключение.

2. Использование возврата с исключениями

def test_func():
    try:
        x = 10
        raise Exception
    except Exception as e:
        print(f" Raising exception ")
        x = 20
        return x
    finally:
        x = 30
        return x
print(test_func())

Output:
Raising exception 
30

Итак, снова выходным значением x будет 30. Мы должны помнить тот факт, что оператор finally выполняется ВСЕГДА.

Чтобы иметь более четкое представление о потоке выполнения, давайте добавим операторы печати в каждый блок.

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
        return x
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x
print(test_func())

Output:
Inside try block 
Inside finally block 
30

Это дало бы представление о потоке выполнения. Теперь, когда мы хорошо понимаем, как try / except / finally работает с операторами return, давайте попробуем втиснуть другое предложение.

Предложение else может быть добавлено вместе с try / except, и предложение else будет выполнено, если блок try не вызовет исключение.

3. Использование return с помощью try / else / finally

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
        return x
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    else:
        print(f" Inside else block ")
        x = 40
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x



print(test_func())
Output:
Inside try block 
Inside finally block 
30

Итак, почему здесь не было выполнено предложение else, хотя блок try не вызвал никаких исключений. Обратите внимание на оператор return в блоке try. Блок else никогда не выполнялся, потому что функция вернулась еще до того, как выполнение достигло предложения else.

Теперь удалите оператор return в блоке try и снова выполните приведенный выше код.

def test_func():
    try:
        x = 10
        print(f" Inside try block ")
    except Exception as e:
        x = 20
        print(f" Inside except block ")
        return x
    else:
        print(f" Inside else block ")
        x = 40
        return x
    finally:
        x = 30
        print(f" Inside finally block ")
        return x



print(test_func())
Output:
Inside try block 
Inside else block 
Inside finally block 
30

Резюме:

  • Будьте особенно осторожны при добавлении return в предложениях try / except / finally.
  • Предложение finally выполняется независимо от того, вызывает ли оператор try исключение.
  • Если предложение finally включает оператор return, возвращаемое значение будет значением из оператора return предложения finally.
  • Предложение else будет выполнено, если блок try не вызовет исключение.

Использованная литература:

Python на простом английском

Вы знали, что у нас есть три публикации и канал на YouTube? Найдите ссылки на все на plainenglish.io!