предложение try-finally в Python ведет себя неожиданно - PullRequest
0 голосов
/ 28 января 2019

В моем понимании того, как попытаться / исключить / наконец-то работать в Python, может быть ошибка, но я ожидаю, что следующее будет работать, как описано в комментариях.

from sys import argv

try:
    x = argv[1]  # Set x to the first argument if one is passed
finally:
    x = 'default'  # If no argument is passed (throwing an exception above) set x to 'default'

print(x)

Я ожидаю, что файлвыше (foo.py) должен печатать default при запуске как python .\foo.py и печатать bar при запуске как python .\foo.py bar.

Функциональность bar работает, как и ожидалось, однако default поведение не работает;если я запускаю python .\foo.py, я получаю IndexError:

Traceback (most recent call last):
  File ".\foo.py", line 4, in <module>
    x = argv[1]
IndexError: list index out of range

В результате у меня есть два вопроса:

  • Это ошибка или ожидаемое поведение вблок try-finally?
  • Должен ли я просто никогда не использовать try-finally без предложения except?

1 Ответ

0 голосов
/ 28 января 2019

Это ожидаемое поведение.try:..finally:... один не ловит исключения .Только except предложение try:...except:....

try:...finally:... гарантирует только то, что операторы в finally всегда выполняются, что бы ни происходило в разделе try, независимо от того, успешно ли выполнен блок или нетвыход из-за break, continue, return или исключения.Так что try:...finally:... - это отлично для очистки ресурсов;вы можете запускать код независимо от того, что происходит в блоке (но учтите, что оператор with и менеджеры контекста также позволяют инкапсулировать поведение очистки).Если вы хотите увидеть примеры, то у стандартной библиотеки Python есть сотни .

Если вам нужно обработать исключение IndexError в блоке try, то вы должны используйте предложение except.Вы все еще можете использовать finally предложение , а также , оно будет вызвано после запуска except suite.

И если вам когда-нибудь удастся поработать со значительно более старым кодом Pythonвы увидите, что в коде, который должен работать с Python 2.4 или старше, try:....finally:... и try:...except:... никогда не используются вместе.Это потому, что только в Python 2.5 две формы были объединены.

...