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中的一些类型转换函数小结
Feb 10 Python
python和C语言混合编程实例
Jun 04 Python
如何搜索查找并解决Django相关的问题
Jun 30 Python
django实现分页的方法
May 26 Python
Python编程之序列操作实例详解
Jul 22 Python
Python将DataFrame的某一列作为index的方法
Apr 08 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
Python上下文管理器全实例详解
Nov 12 Python
python各层级目录下import方法代码实例
Jan 20 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
python各种excel写入方式的速度对比
Nov 10 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上传、管理照片示例
2006/10/09 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
javascript 获取图片颜色
2009/04/05 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
实现Python与STM32通信方式
2019/12/18 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
应聘教师自荐信
2013/10/12 职场文书
考核评语大全
2014/04/29 职场文书
委托书英文
2015/01/28 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
无线电知识基础入门篇
2022/02/18 无线电
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS