总的来说,我对 Python 和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便我可以输出....
表明脚本仍在运行。
我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这是可以的;但是,使用以下代码不起作用:
try:
threadClass = TheThread(param1, param2, etc.)
threadClass.start() ##### **Exception takes place here**
except:
print "Caught an exception"
在线程类本身中,我尝试重新抛出异常,但它不起作用。我看到这里的人提出了类似的问题,但他们似乎都在做比我想做的更具体的事情(而且我不太理解所提供的解决方案)。我看到有人提到使用sys.exc_info()
,但我不知道在哪里或如何使用它。
Edit:线程类的代码如下:
class TheThread(threading.Thread):
def __init__(self, sourceFolder, destFolder):
threading.Thread.__init__(self)
self.sourceFolder = sourceFolder
self.destFolder = destFolder
def run(self):
try:
shul.copytree(self.sourceFolder, self.destFolder)
except:
raise
问题是thread_obj.start()
立即返回。您生成的子线程在其自己的上下文中执行,并具有自己的堆栈。发生的任何异常都发生在子线程的上下文中,并且位于其自己的堆栈中。我现在能想到的将此信息传递给父线程的一种方法是使用某种消息传递,因此您可能会研究一下。
试穿一下尺码:
import sys
import threading
import queue
class ExcThread(threading.Thread):
def __init__(self, bucket):
threading.Thread.__init__(self)
self.bucket = bucket
def run(self):
try:
raise Exception('An error occured here.')
except Exception:
self.bucket.put(sys.exc_info())
def main():
bucket = queue.Queue()
thread_obj = ExcThread(bucket)
thread_obj.start()
while True:
try:
exc = bucket.get(block=False)
except queue.Empty:
pass
else:
exc_type, exc_obj, exc_trace = exc
# deal with the exception
print exc_type, exc_obj
print exc_trace
thread_obj.join(0.1)
if thread_obj.isAlive():
continue
else:
break
if __name__ == '__main__':
main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)