Python中的SyntaxError不一致?

时间:2009-12-06 19:54:43

标签: python exception

考虑这两个片段:

try:
    a+a=a
except SyntaxError:
    print "first exception caught"

try:
    eval("a+a=a")
except SyntaxError:
    print "second exception caught"

在第二种情况下,打印“第二个异常..”语句(异常捕获),而在第一个中则不是。

第一个异常(让我们称之为“SyntaxError1”)与第二个异常(“SyntaxError2”)?

有没有办法捕获SyntaxError1(从而抑制编译时错误)?在eval中包装大块代码是不能令人满意的;)

2 个答案:

答案 0 :(得分:19)

在第一种情况下,编译器会引发异常,它在 try/except结构之前运行甚至存在(因为编译器本身就是将在解析后立即设置)。在第二种情况下,编译器运行两次 - 当编译器作为eval的一部分运行时会引发异常,第一次运行编译器之后已经设置了try/except

因此,要以这种或那种方式拦截语法错误,您必须安排编译器运行两次 - eval是单向的,显式compile内置函数调用另一种方式,{ {1}}非常方便(将代码写入另一个文件后),importexec其他可能性。但是,无论如何,只有在编译器第一次运行以设置您需要的execfile块之后才能捕获语法错误!

答案 1 :(得分:2)

简短回答:不。

语法错误在解析代码时发生,对于正常的Python代码在代码执行之前发生 - 代码不在try / except块内执行,因为代码没有执行,句点。

但是,当您评估或执行某些代码时,您将在运行时解析它,以便捕获异常。