考虑这两个片段:
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
中包装大块代码是不能令人满意的;)
答案 0 :(得分:19)
在第一种情况下,编译器会引发异常,它在 try/except
结构之前运行甚至存在(因为编译器本身就是将在解析后立即设置)。在第二种情况下,编译器运行两次 - 当编译器作为eval
的一部分运行时会引发异常,在第一次运行编译器之后已经设置了try/except
。
因此,要以这种或那种方式拦截语法错误,您必须安排编译器运行两次 - eval
是单向的,显式compile
内置函数调用另一种方式,{ {1}}非常方便(将代码写入另一个文件后),import
和exec
其他可能性。但是,无论如何,只有在编译器第一次运行以设置您需要的execfile
块之后才能捕获语法错误!
答案 1 :(得分:2)
简短回答:不。
语法错误在解析代码时发生,对于正常的Python代码在代码执行之前发生 - 代码不在try / except块内执行,因为代码没有执行,句点。
但是,当您评估或执行某些代码时,您将在运行时解析它,以便捕获异常。