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
非常方便(在将代码写入另一个文件之后), exec
和execfile
还有其他的可能性。 但是无论如何,语法错误只有在编译器第一次运行一次才能设置您需要的try/except
块后才能被捕获!
简短的回答:不。
语法错误发生在parsing代码时,对于普通的Python代码来说,在执行代码之前会发生语法错误 – 由于代码没有执行,代码不会在try / except块内部执行。
但是当你评估或者执行一些代码的时候,你在运行时parsing它,这样你就可以捕获到exception。