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绘图方法实例入门
May 19 Python
详解Python中的type()方法的使用
May 21 Python
Python读取word文本操作详解
Jan 22 Python
详解tensorflow实现迁移学习实例
Feb 10 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
python logging日志模块以及多进程日志详解
Apr 18 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Python脚本完成post接口测试的实例
Dec 17 Python
python中seaborn包常用图形使用详解
Nov 25 Python
python自动识别文本编码格式代码
Dec 26 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
python文件目录操作之os模块
May 08 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
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
python中map()与zip()操作方法
2016/02/27 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
2014年道德讲堂实施方案
2014/03/05 职场文书
实验室的标语
2014/06/20 职场文书
市场营销计划书范文
2015/01/16 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
redis实现共同好友的思路详解
2021/05/26 Redis
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python