Python中的SyntaxError不一致?

考虑这两个片段:

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

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

在第二种情况下,“第二个exception”声明被打印(exception捕获),而第一个不是。

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

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

在第一种情况下,编译器引发exception,在try/except结构甚至存在 之前运行(因为编译器本身将在parsing之后立即进行设置)。 在第二种情况下,编译器运行两次 – 编译器作为eval一部分运行时,编译器的第一次运行已经设置try/except ,引发exception。

因此,为了拦截语法错误,你必须安排编译器运行两次eval是一种方法,显式compile内置函数调用另一个, import非常方便(在将代码写入另一个文件之后), execexecfile还有其他的可能性。 但是无论如何,语法错误只有在编译器第一次运行一次才能设置您需要的try/except块后才能被捕获!

简短的回答:不。

语法错误发生在parsing代码时,对于普通的Python代码来说,在执行代码之前会发生语法错误 – 由于代码没有执行,代码不会在try / except块内部执行。

但是当你评估或者执行一些代码的时候,你在运行时parsing它,这样你就可以捕获到exception。