下面的 Python 程序启动一个线程,然后继续在主线程中执行操作。我将整个主线程包装在一个 try-except 块中,这样如果发生异常,我可以关闭所有正在运行的线程。
当我使用 Python 2.7.5 运行脚本并在程序执行期间在随机点调用 KeyboardInterrupt 时,异常被触发但未被捕获。程序继续运行。
$ python test.py
Running server ...
Searching for servers ...
^CTraceback (most recent call last):
File "test.py", line 50, in <module>
main()
File "test.py", line 40, in main
app_main()
File "test.py", line 35, in app_main
searchservers()
File "test.py", line 26, in searchservers
time.sleep(0.0005)
KeyboardInterrupt
我错过了main()
发生异常时打印的输出中的一行。
代码
import time
import threading
thread_pool = []
running = False
def stop():
global running
running = False
def runserver():
print "Running server ..."
global running
running = True
while running:
time.sleep(0.07)
def searchservers():
print "Searching for servers ..."
for i in xrange(256):
for j in xrange(256):
time.sleep(0.0005)
def app_main():
server = threading.Thread(target=runserver)
thread_pool.append(server)
server.start()
time.sleep(0.1)
searchservers()
stop()
def main():
try:
app_main()
except Exception as exc:
stop()
print "%s occured, joining all threads..." % exc.__class__.__name__
for thread in thread_pool:
thread.join()
raise exc
if __name__ == "__main__":
main()
为什么没有捕获键盘中断?在线程程序中捕获异常并拆除整个过程的正确方法是什么?