#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
исключение и отбрасываете его, чего вам никогда не следует делать, если у вас нет для этого веской причины (которой у вас нет).