python如何手动抛出typeerror异常_「每天一个Python实用技巧」4.父线程捕获子线程抛出的异常...

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),欢迎大家下载使用,多多交流***

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值