1

我了解到 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不会在运行之前检查所有语法吗?

4

2 回答 2

4

Python首先将代码编译为字节码。如果失败,SyntaxError则引发 a,表示编译失败。

因此,您无法从本身具有语法错误SyntaxError的模块中捕获异常。由于 Python 会根据需要编译文件,因此您可以捕获导入模块的异常。SyntaxError

以下打印Failed to import test

测试.py

print,

捕获语法错误.py

try:
    import test
except SyntaxError:
    print 'Failed to import test'

然后运行python catchsyntaxerror.py

于 2012-12-08T09:04:22.087 回答
1

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

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

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

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

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

于 2012-12-08T09:12:38.820 回答