Python 为什么可以';SyntaxError不会被用户代码捕获吗?

Python 为什么可以';SyntaxError不会被用户代码捕获吗?,python,python-2.7,exception-handling,Python,Python 2.7,Exception Handling,我想捕捉每个程序错误,以便在GUI程序中显示这些错误,但我发现我无法捕捉某些类型的错误,如SyntaxError和IndentError 例如: import traceback zero = 0 try: print "start..." v = 3/zero # deliberately no indention, SyntaxError cannot be caught except: print "Oooooooooooooops" traceback.pr

我想捕捉每个程序错误,以便在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不会意外出现。如果您能够运行一次程序,那么在以后的调用中将不会出现语法错误(当然,除非您更改代码)

另一个很好的回答是谢谢你的指导。在这种情况下,“捕获”它的唯一方法是让父进程从python程序捕获stderr。