为什么 SyntaxError 不能被用户代码捕获?
Why can't SyntaxError be caught by user code?
我想捕获每个程序错误,以便在我的 GUI 程序中显示这些错误,但我发现我无法捕获某些类型的错误,例如 SyntaxError 和 IndentError。
例如:
import traceback
zero = 0
try:
print "start..."
v = 3/zero # deliberately no indention, SyntaxError cannot be caught
except:
print "Oooooooooooooops"
traceback.print_exc()
exit(1)
print "run ok"
控制台输出为:
File "D:\w\personal\chj\python-try\catch-syntaxerror\catch_syntax_err.py", line 8
v = 3/zero # ``SyntaxError: invalid syntax``, cannot be catched by user
^
SyntaxError: invalid syntax
所以,我知道我自己没有捕捉到异常。
我怎样才能抓住它?
在代码实际 运行 之前抛出 SyntaxError。特别是您的错误处理程序尚未创建执行。
(您会注意到,如果您的代码中有任何生成输出的内容,例如 print 语句,当语法有问题时,无论它们在代码中的什么位置,都不会生成输出)。
但是在您描述的用例中,我真的不明白您为什么需要捕获 SyntaxError。在我看来,您可能想要捕获取决于程序状态的错误。 SyntaxError 不要意外弹出。如果您能够 运行 您的程序一次,您将不会在以后的调用中出现 SyntaxError(当然,除非您更改代码)。
我想捕获每个程序错误,以便在我的 GUI 程序中显示这些错误,但我发现我无法捕获某些类型的错误,例如 SyntaxError 和 IndentError。
例如:
import traceback
zero = 0
try:
print "start..."
v = 3/zero # deliberately no indention, SyntaxError cannot be caught
except:
print "Oooooooooooooops"
traceback.print_exc()
exit(1)
print "run ok"
控制台输出为:
File "D:\w\personal\chj\python-try\catch-syntaxerror\catch_syntax_err.py", line 8
v = 3/zero # ``SyntaxError: invalid syntax``, cannot be catched by user
^
SyntaxError: invalid syntax
所以,我知道我自己没有捕捉到异常。
我怎样才能抓住它?
在代码实际 运行 之前抛出 SyntaxError。特别是您的错误处理程序尚未创建执行。
(您会注意到,如果您的代码中有任何生成输出的内容,例如 print 语句,当语法有问题时,无论它们在代码中的什么位置,都不会生成输出)。
但是在您描述的用例中,我真的不明白您为什么需要捕获 SyntaxError。在我看来,您可能想要捕获取决于程序状态的错误。 SyntaxError 不要意外弹出。如果您能够 运行 您的程序一次,您将不会在以后的调用中出现 SyntaxError(当然,除非您更改代码)。