[英]what does python really do when it starts to run?
我了解到SyntaxError是唯一无法捕获的错误。 例如:
if __name__ == "__main__":
print "main running"
try:
for i in range(3):
except SyntaxError,e:
print "error caught"
finally:
print "i am here"
好吧,我希望可以显示打印“ main running”,这不是python在运行之前检查所有语法吗?
Python首先将代码编译为字节码。 如果失败,则引发SyntaxError
,指示编译失败。
因此,您无法从本身具有语法错误的模块中捕获SyntaxError
异常。 由于Python根据需要编译文件,因此您可以为导入的模块捕获SyntaxError
异常。
以下打印Failed to import test
:
test.py
print,
catchsyntaxerror.py
try:
import test
except SyntaxError:
print 'Failed to import test'
然后运行python catchsyntaxerror.py
。
在运行时无法检测到SyntaxError
,因为无效语法会损害整个模块的有效性,而不仅限于作者认为犯错的特定行。 由于解释器无法理解作者的意图,因此在无法阅读源代码之后,唯一可以做的就是引发错误。
正如Martin Pieters回答的那样,失败发生在编译步骤,在该步骤中Python读取了整个模块,然后在运行之前将其编译到内存中。 但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的潜在问题仍然存在。
为了在同一模块内在运行时捕获语法错误,必须将错误代码与周围的代码隔离开。 这可以使用exec
语句或eval
函数来完成:
>>> try:
... exec """
... this doesn't work
... """
... except SyntaxError:
... print "fail"
...
fail
要捕获导入模块中的语法错误,只需将try
/ except
放在import
语句周围即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.