python中实际使用的内置SyntaxError是什么?

时间:2019-01-01 21:09:13

标签: python error-handling syntax syntax-error

用Python内置的SyntaxError有什么意义?它似乎没有任何实际用途,因为SyntaxError是由python解释器运行之前发现的。示例:

try:
    &@!5_+ #SyntaxError
except: pass

这以SyntaxError失败,因为找到SyntaxError才可以对其进行处理。现在,它可以正常工作,并且会像预期的那样无声地失败:

try:
    raise SyntaxError
except: pass

但是,我从未见过functionclass任何东西引发SyntaxError。那么,当唯一的用途似乎无意义地提高了它的价值时,为什么它如此易于使用和捕获呢? python是否在某个地方引发了SyntaxError可以被捕获的情况?还是只是退出内置作用域而已?

3 个答案:

答案 0 :(得分:3)

我相信documentation是不言自明的:

  

在解析器遇到语法错误时引发。这可能发生在导入语句,对内置函数exec()eval()的调用中,或者在读取初始脚本或标准输入时(也以交互方式)。

答案 1 :(得分:1)

解决此问题的简单方法是搜索在实践中如何引发此异常。我已经下载了CPython源代码,所以我做了

find . -type f -name "*.py" | xargs grep "raise SyntaxError"

我们看到有一个执行文件转换的实用程序脚本,如果在正确的位置看不到魔术字节,则会引发语法错误。另外,xml库在解析XPath表达式时使用它们。

这表明它也应由处理其他内容的用户代码使用。在Google搜索“ raise SyntaxError”时,显示了以这种方式使用它的许多结果。

我对Python内部并不十分熟悉,但是我认为能够像解析其他错误一样处理源代码解析错误。另外eval等必须提出一些建议,例如文档和先前的答案状态。

答案 2 :(得分:1)

在程序中很少使用SyntaxError。通常仅在遇到无效语法时才用于python解释器。

我能想到的唯一情况是,您在未知值上使用SyntaxErrorexec时会捕获eval。例如,如果您正在执行用户输入,则输入可能无效,并且您需要捕获SyntaxError