python在开始运行时真正做什么?
我了解到SyntaxError是唯一无法捕获的错误。 例如:python在开始运行时真正做什么?,python,syntax-error,Python,Syntax Error,我了解到SyntaxError是唯一无法捕获的错误。 例如: if __name__ == "__main__": print "main running" try: for i in range(3): except SyntaxError,e: print "error caught" finally: print "i am here" 嗯,我希望打印“主运行”可以显示,但它没有 那么python在运行之
if __name__ == "__main__":
print "main running"
try:
for i in range(3):
except SyntaxError,e:
print "error caught"
finally:
print "i am here"
嗯,我希望打印“主运行”可以显示,但它没有
那么python在运行之前是否检查了所有语法?python首先将代码编译为字节码。如果失败,将引发一个SyntaxError
,指示编译失败
因此,您无法从模块中捕获本身存在语法错误的SyntaxError
异常。由于Python会根据需要编译文件,因此可以捕获导入模块的SyntaxError
异常
以下打印导入测试失败:
test.py
catchsyntaxerror.py
然后运行python catchsyntaxerror.py
python首先将代码编译成字节码。如果失败,将引发一个SyntaxError
,指示编译失败
因此,您无法从模块中捕获本身存在语法错误的SyntaxError
异常。由于Python会根据需要编译文件,因此可以捕获导入模块的SyntaxError
异常
以下打印导入测试失败:
test.py
catchsyntaxerror.py
然后运行python-catchsyntaxerror.py
在运行时无法检测SyntaxError
,因为无效语法会损害整个模块的有效性,而不仅仅是作者认为出错的特定行的有效性。由于解释器不理解作者的意图,因此在未能读取源代码后,它唯一能做的就是提出错误
正如Martin Pieters所回答的,失败发生在编译步骤,Python在运行模块之前读取整个模块并将其编译到内存中。但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的根本问题仍然存在
要在同一模块中捕获运行时的语法错误,必须将错误代码与周围代码隔离开来。这可以使用exec
语句或eval
函数来完成:
>>> try:
... exec """
... this doesn't work
... """
... except SyntaxError:
... print "fail"
...
fail
要捕获导入模块中的语法错误,只需在import
语句周围放置try
/除外。在运行时无法检测SyntaxError
,因为无效的语法会损害整个模块的有效性,不仅仅是作者认为犯了错误的那一行。由于解释器不理解作者的意图,因此在未能读取源代码后,它唯一能做的就是提出错误
正如Martin Pieters所回答的,失败发生在编译步骤,Python在运行模块之前读取整个模块并将其编译到内存中。但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的根本问题仍然存在
要在同一模块中捕获运行时的语法错误,必须将错误代码与周围代码隔离开来。这可以使用exec
语句或eval
函数来完成:
>>> try:
... exec """
... this doesn't work
... """
... except SyntaxError:
... print "fail"
...
fail
要捕获导入模块中的语法错误,只需在import
语句周围放置try
/,除了。您的意思是它编译到.pyc?@cui:.pyc
文件是字节码缓存,存储编译结果,是的。@cui如果您只是运行脚本(而不是导入模块),Python将把脚本编译到内存中。@Martijn Pieters我试过了,真的如你所说。python似乎只是试图从main.py中找到明显的语法,它在运行时检查导入的文件SyntaxError您的意思是它编译到.pyc?@cui:the.pyc
文件是字节码缓存,存储编译结果,是的。@cui如果您只是运行脚本(而不是导入模块),Python将把脚本编译到内存中。@Martijn Pieters我试过了,真的如你所说。python似乎只是试图从main.py中找到明显的语法,它在运行时检查导入的文件SyntaxError
>>> try:
... exec """
... this doesn't work
... """
... except SyntaxError:
... print "fail"
...
fail