作者os653 (allstar)
看板Python
标题Re: [问题] 请问如何在Pipe中处理KeyboardInterrupt
时间Mon Feb 20 14:25:00 2012
终於搞懂了,只是之前没想清楚,这段 code 应该是这样跑的
def run(rpipe):
try:
data = rpipe.recv()
exec(data)
except:
# 因为抓到 EOFError 而跑进来
# 之前被 block 的 KeyboardInterrupt 作用了
# 等同这边写了 raise KeyboardInterrupt
# 所以底下那行本来就执行不到 XD
print 'except'
finally:
print 'finally'
盲点在拿 Python 的想法去想执行顺序,所以没发现那空隙
实际上要抓到 KeyboardInterrupt 必须要再包一层 try ... except 才行
像这样
def run(rpipe):
try:
try:
data = rpipe.recv()
exec(data)
except EOFError:
print '这一行永远不可能执行到'
finally:
print 'EOFError finally'
except KeyboardInterrupt:
print 'KeyboardInterrupt'
finally:
print 'KeyboardInterrupt finally'
後遗症就是无法检查是否产生过 EOFError
这问题应该在所有会 block interrupt 的函式上都有可能发生,不知道算不算 bug?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.41.140.104