Python 如何检查线程(从一堆线程中)是否抛出异常?

Python 如何检查线程(从一堆线程中)是否抛出异常?,python,multithreading,exception,Python,Multithreading,Exception,我创建了一个运行多个线程的脚本。每个线程在无限循环中运行一个函数。我想知道是否有线程抛出异常 以下是线程启动的基本结构: def main(): VODP = Packager() WINSCP = WinSCP() threadList = [] threadList.append(threading.Thread(target=VODP.scan)) threadList.append(threading.Thread(target=WINSCP.ft

我创建了一个运行多个线程的脚本。每个线程在无限循环中运行一个函数。我想知道是否有线程抛出异常

以下是线程启动的基本结构:

def main():
    VODP = Packager()
    WINSCP = WinSCP()
    threadList = []
    threadList.append(threading.Thread(target=VODP.scan))
    threadList.append(threading.Thread(target=WINSCP.ftp_sender))
    threadList.append(threading.Thread(target=WINSCP.ftp_status_checker))
    threadList.append(threading.Thread(target=WINSCP.synchronize))
    for thread in threadList:
        thread.start()
    for thread in threadList:
        thread.join()

main()
下面是一个在无限循环中具有函数的类的示例:

class Packager:
    def __init__(self):
        self.rootDir, self.scanTime, self.extendedScanTime = self.configure_packager()
        self.foldersReadyToPack = []
    def scan(self):
        while True:
            if self.foldersReadyToPack == []:
                for dirpath, dirnames, filenames in os.walk(self.rootDir):
                    if(folder_verifier(dirpath)):
                        #print("Currently scanned folder: ", dirpath)
                        package_creator(dirpath)
                if len(self.foldersReadyToPack) > 0:
                    #print(f'Folders with suitable files has been found!')
                    packingQueue = PackingQueue(self.foldersReadyToPack)
                    packingQueue.execute_packing()
                    self.foldersReadyToPack = packingQueue.elements
我怎样才能做到这一点?如何获取线程抛出异常并且不再在无限循环中执行其任务的信息?当程序中出现可疑情况时,我想将这些信息传递给负责发送电子邮件的班级。

您可以使用:


请看一下这个主题,你可能会发现它很有帮助,因为有很多方法可以从线程中获得结果:(我建议看一下
concurrent.futures
)。因此在我的例子中,由于
foo\u with_exc
功能是无限重复的,我应该把
try
语句放在
之前,而True
语句除外,除了产生错误的
语句?或者我应该在启动/连接线程时放置它?
import concurrent.futures


def foo_with_exc(a, b):
    raise ValueError()


def thread_starter():
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
        future = executor.submit(foo_with_exc, 1, 2)

        # Raise any exceptions raised by thread
        return future.result()


try:
    thread_starter()
except ValueError as e:
    print("Exception!")