在特殊情况下,Python的try和except 块似乎都被评估了



我有一个简单的Python代码,其中有一个try块,如果存在,它会打开一个文件,并打印一条消息(M!(,如果不存在,则退出。除外块打印不同的消息(M2(。不知什么原因,它同时打印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

请告诉我是否有人能破译发生了什么?

try块一直执行到引发异常为止。当这种情况发生时,except块执行。因此,在这种情况下,在打印"file not found"一段时间后会抛出异常。您可以通过明确地捕获异常来进一步研究这一点:

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

sys.exit通过引发一个SystemExit异常退出,该异常是您的裸except块捕获的。这就是为什么永远不应该有一个空的except块,而应该始终有except Exception(或者更具体的异常(。SystemExit不在Exception层次结构中,因此可以绕过它。另外:添加日志记录语句,查看是什么导致了您捕获的异常。

最新更新