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中用于求最小值的min()方法
May 15 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
python实现简单多人聊天室
Dec 11 Python
python如何获取apk的packagename和activity
Jan 10 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 Python
Python中有几个关键字
Jun 04 Python
Python 串口通信的实现
Sep 29 Python
Python的信号库Blinker用法详解
Dec 31 Python
python 经纬度求两点距离、三点面积操作
Jun 03 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
js右键菜单效果代码
2007/07/21 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
详解numpy的argmax的具体使用
2019/05/27 Python
python 字典套字典或列表的示例
2019/12/16 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
幼儿园庆六一游园活动方案
2014/01/29 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
请假条标准格式规范
2014/04/10 职场文书
初一学生评语大全
2014/04/24 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript