请考虑以下代码:
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中?最后,我如何修复上面的代码,以便正确处理异常?
注意:我知道我要做的事情完全没有意义,没有任何实际意义
答案 0 :(得分:22)
SyntaxError
是一个完全普通的内置异常。它没有任何特殊之处。只有在(通常)抛出的情况下才有点不寻常。
语法错误意味着无法解析具有所述错误的代码。它甚至没有开始成为有效的程序,因此无法执行。因此,在程序运行之前会引发{em}个{em},因此无法从程序中捕获。
更具体地说,解析器引发了这个异常。因为解析器在执行代码之前完全运行,而不是与代码交错,所以程序无法捕获自己的语法错误。
解析器本身只是另一个程序:调用解析器的代码可以像其他每个异常一样捕获SyntaxError
(因为 就像其他所有异常一样)。 “调用解析器”的示例包括:
SyntaxError
,compile
,exec
eval
陈述import
,ast
,tokenizer
等模块中的多项功能答案 1 :(得分:7)
当然,您需要SyntaxError
作为内置异常 - 如果编译器/解析器遇到语法错误,还应该引发什么?
你是对的,这个错误通常发生在编译时,这是在你能够捕获它(运行时)之前。 (你将如何从中恢复?)
但我可以想到一个例外:
>>> try:
... eval("hello =")
... except SyntaxError:
... print("Hey! Who's using eval() anyway??")
...
Hey! Who's using eval() anyway??