python主线程捕获子线程的方法


Posted in Python onJune 17, 2018

最近,在做一个项目时遇到的了一个问题,主线程无法捕获子线程中抛出的异常。

先看一个线程类的定义

''''' 
Created on Oct 27, 2015 
 
@author: wujz 
''' 
import threading 
 
class runScriptThread(threading.Thread): 
 def __init__(self, funcName, *args): 
  threading.Thread.__init__(self) 
  self.args = args 
  self.funcName = funcName 
  
 def run(self): 
  try: 
   self.funcName(*(self.args)) 
  except Exception as e: 
   raise e

很简单,传入要调用的方法,并启用一个新的线程来运行这个方法。

在主线程中,启动这个线程类的一个对象时,这要声明一个对象然后启动就可以了,示例如下

import runScriptThread,traceback 
 
if __name__=='__main__': 
 sth = 'hello world' 
 try: 
  aChildThread = runScriptThread(printSth, sth) 
  aChildThread.start() 
  aChildThread.join() 
 except Exception as e: 
  print(str(traceback.format_exc()))

但是这样的代码,main方法中无法捕获子线程中的异常,原因在于start()方法将为子线程开辟一条新的栈,main方法的栈因此无法捕获到这一异常。

解决方法很简单,就是通过设置一个线程是否异常退出的flag的成员变量,当线程异常退出时,对其作一标记。然后在主线程中检查改线程运行结束后该标志位的值,如果异常,再通过sys和traceback回溯异常信息,然后抛出即可。改写后的异常类:

''''' 
Created on Oct 27, 2015 
 
@author: wujz 
''' 
import threading,traceback,sys 
 
class runScriptThread(threading.Thread): #The timer class is derived from the class threading.Thread 
 def __init__(self, funcName, *args): 
  threading.Thread.__init__(self) 
  self.args = args 
  self.funcName = funcName 
  self.exitcode = 0 
  self.exception = None 
  self.exc_traceback = '' 
  
 def run(self): #Overwrite run() method, put what you want the thread do here 
  try: 
   self._run() 
  except Exception as e: 
   self.exitcode = 1  # 如果线程异常退出,将该标志位设置为1,正常退出为0 
   self.exception = e 
   self.exc_traceback = ''.join(traceback.format_exception(*sys.exc_info())) #在改成员变量中记录异常信息 
  
 def _run(self): 
  try: 
   self.funcName(*(self.args)) 
  except Exception as e: 
   raise e

改写后的主线程:

import runScriptThread,traceback 
 
if __name__=='__main__': 
 sth = 'hello world' 
 try: 
  aChildThread = runScriptThread(printSth, sth) 
  aChildThread.start() 
  aChildThread.join() 
 except Exception as e: 
  print(aChildThread.exc_traceback)

以上全部为本篇文章的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python快速排序代码实例
Nov 21 Python
Python实现的最近最少使用算法
Jul 10 Python
python实现多线程的两种方式
May 22 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
python web基础之加载静态文件实例
Mar 20 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 #Python
Python实现自定义函数的5种常见形式分析
Jun 16 #Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 #Python
Python实现简单的文本相似度分析操作详解
Jun 16 #Python
Django跨域请求问题的解决方法示例
Jun 16 #Python
Python for循环生成列表的实例
Jun 15 #Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 #Python
You might like
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
github配置使用指南
2014/11/18 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
用Python开发app后端有优势吗
2020/06/29 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
自动化专业本科毕业生求职信
2013/10/20 职场文书
技术总监管理职责范本
2014/03/06 职场文书
升旗仪式主持词
2014/03/19 职场文书
运动会拉拉队口号
2014/06/09 职场文书
班级课外活动总结
2014/07/09 职场文书
家具商场的活动方案
2014/08/16 职场文书
流动人口婚育证明
2014/10/19 职场文书
见习报告的格式
2014/10/31 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
7个关于Python的经典基础案例
2021/11/07 Python