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多线程抓取天涯帖子内容示例
Apr 03 Python
Python脚本实现代码行数统计代码分享
Mar 10 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
python对excel文档去重及求和的实例
Apr 18 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
如何在C++中调用Python
May 21 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
Search Engine Friendly的URL设计
2006/10/09 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
Java基础类库面试题
2013/09/04 面试题
大学生毕业自我评价范文分享
2013/11/07 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
社区志愿者活动方案
2014/08/18 职场文书
离职证明标准格式
2014/09/15 职场文书
走群众路线学习笔记
2014/11/06 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB