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中logging模块的用法实例
Sep 29 Python
python计算N天之后日期的方法
Mar 31 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
Python while 循环使用的简单实例
Jun 08 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
python中单例常用的几种实现方法总结
Oct 13 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
Python Django基础二之URL路由系统
Jul 18 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
php文件读取方法实例分析
2015/06/20 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
js面向对象编程总结
2017/02/16 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
经理管理专业毕业自荐书范文
2014/02/12 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
家长会主持词开场白
2015/05/29 职场文书