【问题标题】:Can Syntax Errors be handled?可以处理语法错误吗?
【发布时间】:2014-01-15 23:15:01
【问题描述】:

考虑以下代码:

try:
    if True a = 1  #It's missing a colon So it's a SyntaxError!!!!!!!
except SyntaxError:
    print 'hey'

您希望它打印hey 但是它会引发SyntaxError,这是我试图避免的相同错误。那么可以使用try-except 块处理所有异常吗?好吧,如果SyntaxError 是一个例外,为什么它会包含在built-in exceptions 中?最后如何修复上面的代码,以便正确处理异常?

注意:我知道我正在尝试做的是完全没有意义的,没有真正的目的

【问题讨论】:

    标签: python python-2.7 exception-handling


    【解决方案1】:

    SyntaxError 是一个非常普通的内置异常。它在任何方面都不是特别的。只有它(通常)被抛出的情况有点不寻常。

    语法错误意味着具有所述错误的代码无法解析。它甚至还不是一个有效的程序,因此无法执行。因此SyntaxError 异常会在程序运行之前引发,因此无法从程序中捕获。

    更具体地说,这个异常是由解析器引发的。因为解析器在代码执行之前完全运行,而不是与它交错,所以程序无法捕获自己的语法错误。

    解析器本身只是另一个程序:调用解析器的代码可以像其他所有异常一样捕获SyntaxErrors(因为它像所有其他异常一样)。 “调用解析器”的示例包括:

    • compile, exec, eval
    • import 声明
    • asttokenizerparser 等模块中的多个函数

    【讨论】:

      【解决方案2】:

      当然,您需要 SyntaxError 作为内置异常 - 如果编译器/解析器遇到语法错误,还应该引发什么?

      你说得对,这个错误通常发生在编译时,也就是在你能够捕捉到它之前(运行时)。 (你将如何从中恢复?)

      不过,我能想到一个例外:

      >>> try:
      ...    eval("hello =")
      ... except SyntaxError:
      ...    print("Hey! Who's using eval() anyway??")
      ...
      Hey! Who's using eval() anyway??
      

      【讨论】:

      • 所以可以处理一些SyntaxErrors 但不是全部?
      • @MattDMo:好吧,如果 SyntaxError 在运行时出现,那么它可以被捕获。程序如何以有意义的方式处理编译时语法错误?
      • @TimPietzcker 那么我的 sn-p 可以修复以处理异常吗?
      • @KDawG:不,当然不是。正如你自己写的那样,这完全没有意义。
      • 好吧,我猜 OP 可以将整个东西包裹在 exec 中,即 exec """ code """,在 try 块内。不过很丑。
      猜你喜欢
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2011-01-12
      • 2011-06-29
      相关资源
      最近更新 更多