![679724b133d8a22d1cfec23d547e96f6.png](https://img-blog.csdnimg.cn/img_convert/679724b133d8a22d1cfec23d547e96f6.png)
【这是"冲谈技术"的第4篇原创文章】
大家好,我是冲冲,一名主要从事Python服务端开发的程序猿。
以后我会时不时在这里和大家分享服务端软件实际开发工作中用到的实用技术,这些都是历年实践经验的积累,希望大家喜欢!
今天给大家分享的实用技巧是父线程捕获子线程抛出的异常的方法,希望对大家有所帮助和启发。
首先,我们来看下主线程捕获子线程抛出的异常失败的样例。
示例代码如下:
from threading import Thread
def work(i):
if i % 2:
return i
raise Exception('exception i={}'.format(i))
try:
for i in range(3):
t = Thread(target=work, args=(i,))
t.start()
t.join()
except Exception as ie:
print('>>> main thread ie: ', ie.args) # 无法捕获到异常,这里不执行
上面的代码在执行的时候会直接导致进程退出,无法输出“>>> main thread ie:”的语句。
怎么办呢?
请看下面的代码:
import concurrent.futures
from concurrent.futures import ThreadPoolExecutor
# 子线程中的异常,在主线程中except不到的解决办法
def work(i):
if i % 2:
return i
raise Exception('exception i={}'.format(i))
with ThreadPoolExecutor(max_workers=3) as executor:
result_futures = [executor.submit(work, i) for i in range(3)]
for future in concurrent.futures.as_completed(result_futures):
try:
result = future.result() # 当子线程中异常时,这里会重新抛出
except Exception as e: # 捕获子线程中的异常
print('>>> main ThreadPoolExecutor, e: ', e.args) # 成功捕获异常
else:
print(result)
输出为:
>>> main ThreadPoolExecutor, e: ('exception i=2',)
1
>>> main ThreadPoolExecutor, e: ('exception i=0',)
从上面可见,使用ThreadPoolExecutor来实现多线程的方式解决了父线程无法捕获到子线程异常的问题。
相信大家已经了解了父线程捕获子线程抛出的异常的方法。
好啦,今天的实用技巧分享就到这里!
欢迎大家多多和朋友分享我,订阅我,每天分享一个实用知识点,共成长,交个朋友!下期见~~
微信公众号: chongtanjishu
GitHub: streamDream - Overview
***具有MySQL的ORM和Client功能的库(pip install mysql-stream),欢迎大家下载使用,多多交流***