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包装大块代码是不能令人满意的;)

  • 为什么Python允许列表中的尾随逗号?
  • 如何将string拆分为字符数组?
  • 如何在模块名称中带有' - '短划线或连字符时导入模块?
  • 在Python中使用静态方法的优点是什么?
  • 我如何使用Python创build一个Word文档?
  • 什么是最pythonic的方式来检查一个对象是一个数字?
  • 任何想法如何更新窗口框上的Python PIP?
  • 你如何在本地开发OpenID
  • 2 Solutions collect form web for “Python中的SyntaxError不一致?”

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

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

    简短的回答:不。

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

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