繁体   English   中英

python开始运行时,它实际上是做什么的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM