попробуйте / кроме возврата в 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 не вызовет исключение.
Использованная литература:
- Https://docs.python.org/3/tutorial/errors.html
- Https://stackoverflow.com/questions/11164144/weird-try-except-else-finally-behavior-with-return-statements
- Https://docs.python.org/3/library/exceptions.html
Python на простом английском
Вы знали, что у нас есть три публикации и канал на YouTube? Найдите ссылки на все на plainenglish.io!