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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python实现超简单的视频对象提取功能
Jun 04 Python
python采集微信公众号文章
Dec 20 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
python可视化实现KNN算法
Oct 16 Python
基于python判断目录或者文件代码实例
Nov 29 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 Python
10个示例带你掌握python中的元组
Nov 23 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/03 咖啡文化
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Python request使用方法及问题总结
2020/04/26 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
跟单文员岗位职责
2014/01/03 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
优质服务演讲稿
2014/05/14 职场文书
软件售后服务方案
2014/05/29 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python