我了解到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在运行之前检查所有语法吗?
答案 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
语句周围。