python开始运行时真正做了什么?

时间:2012-12-08 09:03:00

标签: 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在运行之前检查所有语法吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

在运行时检测SyntaxError是不可能的,因为无效的语法会损害整个模块的有效性,而不仅仅是作者认为犯了错误的特定行。由于解释器不理解作者的意图,因此在未能阅读源代码后唯一可以做的就是引发错误。

正如Martin Pieters所回答的那样,失败发生在编译步骤,在这个步骤中,Python读取整个模块并在运行之前将其编译到内存中。但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的根本问题仍将存在。

要在同一模块内的运行时捕获语法错误,必须将错误代码与周围代码隔离开来。这可以使用exec语句或eval函数:

来完成
>>> try:
...     exec """
... this doesn't work  
... """
... except SyntaxError:
...     print "fail"
... 
fail

要捕获导入模块中的语法错误,只需将try / except放在import语句周围。