I created a script that runs several threads. Each thread runs a function in infinite loop. I would like to know if any of threads threw an exception.
Here is the basic structure how threads are started:
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()
and here is a sample of a class with function in infinite loop:
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
How can I achieve that? How can get the information that thread has threw an exception and is no longer performing its tasks in infinite loop? I would like to get such information to pass it to class responsible for sending emails, when something suspicious occurs in program.
 
    