【问题标题】:SyntaxError inconsistency in Python?Python中的SyntaxError不一致?
【发布时间】:2021-10-31 11:52:17
【问题描述】:

考虑这两个 sn-ps:

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

.

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

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

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

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

【问题讨论】:

  • 抑制编译时错误????这可能意味着什么?您能否为您希望解析不可解析代码的用例提供一些定义?应该发生什么?代码有多糟糕,但仍然被“解析”?你在说什么?
  • 问题主要集中在不同情况下可能引发的 SyntaxErrors 不一致。 Alex 解释说根本没有不一致,所有描述的行为都包含在编译器构建更高级别的 try/except 结构的机制中。一个可能的用例可能是由受信任的开发人员上传具有某些功能的 *.py 文件(简单的插件系统?),需要在上传后立即验证其语法。

标签: python exception


【解决方案1】:

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

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

【讨论】:

  • 我不知道有多种解决方案。尤其是具有显式导入的一个优雅地解决了我的隐藏案例。非常感谢,亚历克斯!
【解决方案2】:

简短回答:不。

解析代码时会发生语法错误,对于普通的 Python 代码,这是在代码执行之前发生的 - 由于代码未执行,因此代码未在 try/except 块内执行,句号。

但是,当您 eval 或 exec 某些代码时,您是在运行时解析它,因此您可以捕获异常。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2019-04-14
    • 2016-06-06
    • 2011-09-04
    • 2020-06-06
    • 2022-08-08
    相关资源
    最近更新 更多