【发布时间】:2013-02-12 16:13:12
【问题描述】:
在我的真实案例中,Segmentation fault 出现在 finally 子句中,我对此无能为力,因为它源于通过 ctypes 使用的外部库。实际上,我并不关心这个段错误,因为脚本无论如何都完成了。
但是,finally 中的段错误会吃掉之前发生的所有异常。因此,从iDontExist 调试第一个NameError 变得很麻烦。它不会在任何地方发生。目前无法看到在段错误之前引发的任何异常。
def f1():
try:
while True:
pass
except KeyboardInterrupt:
print iDontExist
if __name__=="__main__":
try:
f1()
finally:
raise Exception("segfault here")
print "finally"
你觉得我能做些什么呢?修复外部库不是一种选择。
【问题讨论】:
-
段错误不是
Exception;这是一个导致操作系统终止您的程序的信号,而不是您可以在except块中捕获的信号。如果您只想确保在写入段错误之前缓冲任何内容,您可以在可能出现段错误的行之前尝试sys.stdout.flush(); sys.stderr.flush()。如果您想在段错误之前捕获并记录异常,请在finally之前放置一个except块来记录它。如果你想要别的东西……你想要什么? -
如果我将
sys.stdout.flush(); sys.stderr.flush()放在raise Exception("segfault here")之前,它仍然不会显示NameError。我想要什么:在finally子句中发生任何事情之前查看引发的任何异常 -
嗯,是的,那是因为
NameError还没有打印出来。它作为正常的 exit-interpreter-via-uncaught-exception 的一部分打印出来。如果您不以这种方式退出,则需要以其他方式将其打印出来。 (如 EOL 的示例。) -
不要手动刷新 stdout/stderr,而是尝试
python -u获取无缓冲的二进制 stdout、stderr。这有什么不同吗?
标签: python exception finally try-finally try-except