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

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。

  • 如何设置raw_input的时间限制
  • 访问python字典的元素
  • 定义`__eq__`的types是不可以的?
  • numpy float:在算术运算中比内build速度慢10倍?
  • 尝试安装Python的Postgres时出错(psycopg2)
  • getattr()究竟是什么,我该如何使用它?
  • 删除numpy数组中的行
  • 我如何从C#运行Python脚本?
  • 通过键列表访问嵌套字典项目?
  • Python的难题 - 练习6 - %r与%s
  • 让virtualenv从您的全球网站包inheritance特定的包