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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
一些Python中的二维数组的操作方法
May 02 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
Python3最长回文子串算法示例
Mar 04 Python
python跳出双层for循环的解决方法
Jun 24 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
python自动发微信监控报警
Sep 06 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
在keras下实现多个模型的融合方式
May 23 Python
python语言中有算法吗
Jun 16 Python
Django中session进行权限管理的使用
Jul 09 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&java(一)
2006/10/09 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
python 项目目录结构设置
2020/02/14 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
python3排序的实例方法
2020/10/20 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
私有程序集与共享程序集有什么区别
2013/04/05 面试题
技术人员面试提纲
2013/11/28 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
七一活动主持词
2015/06/29 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
Opencv实现二维直方图的计算及绘制
2021/07/21 Python