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用GET方法上传文件
Mar 10 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 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使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
Python中的super用法详解
2015/05/28 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Python的形参和实参使用方式
2019/12/24 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
思想品德自我评价
2014/02/04 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
小学班级口号
2014/06/09 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
拉贝日记观后感
2015/06/05 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python