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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
跟老齐学Python之让人欢喜让人忧的迭代
Oct 02 Python
解决pandas 作图无法显示中文的问题
May 24 Python
深入理解Python异常处理的哲学
Feb 01 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
如何通过python实现全排列
Feb 11 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
为什么说python适合写爬虫
Jun 11 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 Python
python blinker 信号库
May 04 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
javascript some()函数用法详解
2014/11/13 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
js中生成map对象的方法
2014/01/09 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
浅析javascript的return语句
2015/12/15 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
Python Queue模块详解
2014/11/30 Python
Python多继承顺序实例分析
2018/05/26 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
使用python实现简单五子棋游戏
2019/06/18 Python
python操作kafka实践的示例代码
2019/06/19 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
《音乐之都维也纳》教学反思
2014/04/16 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2014年图书室工作总结
2014/12/09 职场文书
初中毕业生感言
2015/07/31 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python