В особом случае блоки Python try и except, по-видимому, оцениваются

#python

Вопрос:

У меня есть простой код на Python с блоком try, который открывает файл, если он существует, и печатает сообщение (M!), и завершает работу, если его нет. Блок «Кроме» выводит другое сообщение (М2). По какой-то неизвестной причине он печатает как M1, так и M2. Вот код, выполняемый через интерактивный клиент, но тот же результат виден даже при выполнении в неинтерактивном режиме:-

 Python 3.7.4 (default, Feb  7 2020, 04:54:24)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> os.path.isfile("test.txt")
False
>>> try:
...     if os.path.isfile("test.txt"):
...             open("test.txt")
...     else:
...             print("file not found")
...             sys.exit()
... except:
...     print("something else went wrong")
...
file not found
something else went wrong

 

Пожалуйста, дайте мне знать, если кто-нибудь сможет расшифровать, что происходит?

Комментарии:

1. Подсказка: sys.exit вызывает исключение…

2. @deceze спасибо. Теперь я понимаю.

Ответ №1:

try Блок выполняется до тех пор, пока не возникнет исключение. Когда это происходит, except блок выполняется. Таким образом, в этом случае исключение создается через некоторое время после "file not found" печати. Вы можете изучить это подробнее, явно отловив исключение:

 try:
    print("some message")
    sys.exit()
except Exception as e:
    print(e)
 

Ответ №2:

sys.exit завершает работу, вызывая SystemExit исключение, которое улавливает ваш пустой except блок. Именно по этой причине у вас никогда не должно быть пустого except блока, но всегда except Exception (или даже более конкретного исключения). SystemExit не входит в Exception иерархию и, таким образом, может обойти ее. Также: добавьте инструкции по ведению журнала, чтобы узнать, что вызвало пойманное вами исключение.

Комментарии:

1. Спасибо. Я исправил свой код, изменив его следующим образом:- except SystemExit: pass except: print("something else went wrong")

2. Нет, сделай except Exception это . Вы все еще ловите SystemExit исключение и отбрасываете его, чего вам никогда не следует делать, если у вас нет для этого веской причины (которой у вас нет).