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 09 Python
Python如何实现文本转语音
Aug 08 Python
Python图算法实例分析
Aug 13 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
Python中使用subprocess库创建附加进程
May 11 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
JS实现放大镜效果
2020/09/21 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
党的群众路线教育学习材料
2014/05/12 职场文书
员工合理化建议书
2014/05/19 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
nginx内存池源码解析
2021/11/20 Servers