一般来说,我对Python和多线程编程非常陌生。基本上,我有一个脚本,可以将文件复制到另一个位置。我想把它放在另一个线程中,这样我就可以输出…,以指示脚本仍在运行
我遇到的问题是,如果文件无法复制,它将抛出异常。如果在主线程中运行,这是正常的;但是,具有以下代码不起作用:
尝试:
threadClass=线程(param1、param2等)
threadClass.start()######**这里发生异常**
除:
“打印”;抓住了一个例外;
在thread类本身中,我试图重新抛出异常,但它不起作用。我看到这里的人问了类似的问题,但他们似乎都在做一些比我想做的更具体的事情(我不太理解提供的解决方案)。我看到有人提到过使用sys.exc_info(),但我不知道在哪里或如何使用它
编辑:线程类的代码如下:
将线程分类(threading.Thread):
定义初始化(self、sourceFolder、destFolder):
threading.Thread.\uuuuu init\uuuuuu(自)
self.sourceFolder=sourceFolder
self.destFolder=destFolder
def运行(自):
尝试:
shul.copytree(self.sourceFolder、self.destFolder)
除:
提升
问题是thread\u obj.start()会立即返回。生成的子线程在自己的上下文中使用自己的堆栈执行。在那里发生的任何异常都在子线程的上下文中,并且在它自己的堆栈中。我现在可以想到的一种将这些信息传递给父线程的方法是使用某种消息传递,因此您可以对此进行研究
试试这个尺码:
导入系统
导入线程
导入队列
ExcThread类(threading.Thread):
def u u初始(自,桶):
threading.Thread.\uuuuu init\uuuuuu(自)
self.bucket=bucket
def运行(自):
尝试:
引发异常(’此处发生错误’)
除例外情况外:
self.bucket.put(sys.exc_info())
def main():
bucket=Queue.Queue()
螺纹_obj=外螺纹(铲斗)
线程_obj.start()
尽管如此:
尝试:
exc=bucket.get(block=False)
队列除外。空:
通过
其他:
exc_类型,exc_对象,exc_跟踪=exc
#处理例外情况
打印exc_类型,exc_对象
打印exc_跟踪
螺纹连接(0.1)
如果线程_obj.isAlive():
持续
其他:
打破
如果uuuu name uuuuuu=’\uuuuuuu main\uuuuuuu’:
main()