可以处理语法错误吗?

时间:2013-12-28 15:46:43

标签: python python-2.7 exception-handling

请考虑以下代码:

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中?最后,我如何修复上面的代码,以便正确处理异常?

注意:我知道我要做的事情完全没有意义,没有任何实际意义

2 个答案:

答案 0 :(得分:22)

SyntaxError是一个完全普通的内置异常。它没有任何特殊之处。只有在(通常)抛出的情况下才有点不寻常。

语法错误意味着无法解析具有所述错误的代码。它甚至没有开始成为有效的程序,因此无法执行。因此,在程序运行之前会引发{em}个{em},因此无法从程序中捕获。

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

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

  • SyntaxErrorcompileexec
  • eval陈述
  • importasttokenizer等模块中的多项功能

答案 1 :(得分:7)

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

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

但我可以想到一个例外:

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