Python中的语法错误不一致?

Python中的语法错误不一致?,python,exception,Python,Exception,考虑以下两个片段: try: a+a=a except SyntaxError: print "first exception caught" 在第二种情况下,会打印“secondexception..”语句(捕获异常),而在第一种情况下不会打印 第一个异常(我们称之为“SyntaxError1”)与第二个异常(“SyntaxError2”)有什么不同吗 是否有任何方法可以捕获SyntaxError1(从而抑制编译时错误)?在eval中包装大块代码不符合要求;) 在第一种情况

考虑以下两个片段:

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

在第二种情况下,会打印“secondexception..”语句(捕获异常),而在第一种情况下不会打印

第一个异常(我们称之为“SyntaxError1”)与第二个异常(“SyntaxError2”)有什么不同吗


是否有任何方法可以捕获SyntaxError1(从而抑制编译时错误)?在
eval
中包装大块代码不符合要求;)

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

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

简短回答:不

语法错误发生在代码被解析时,对于普通Python代码来说,语法错误发生在代码被执行之前-代码没有在try/except块内执行,因为代码没有执行,句点


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

我不知道有多种解决方案。特别是一个显式导入解决了我的隐藏情况优雅。非常感谢,亚历克斯!正在抑制编译时错误????这可能意味着什么?您能为希望解析不可解析代码的用例提供一些定义吗?会发生什么?代码有多糟糕,但仍然可以被“解析”?你们在说什么?问题主要集中在不同情况下抛出的语法错误可能不一致。Alex解释说根本没有不一致性,所有描述的行为都包含在编译器构造try/except的更高层次结构的机制中。一个可能的用例可能是由可信的开发人员*.py文件上传,该文件具有一些功能(简单的插件系统?),上传后需要立即验证其语法。
try:
    eval("a+a=a")
except SyntaxError:
    print "second exception caught"