Maison >développement back-end >Tutoriel Python >Comment détecter les exceptions générées dans les threads enfants en Python ?
Détecter l'exception d'un thread dans le fil appelant
En Python, la programmation multithread présente des défis dans la gestion des exceptions qui se produisent dans les threads enfants. Lorsque des exceptions surviennent dans un thread enfant, elles restent confinées à ce thread, ce qui rend difficile leur capture et leur traitement par le thread appelant.
Problème principal et justification
Le principal problème réside dans l’immédiateté de la méthode thread_obj.start(). Cette méthode lance l'exécution du thread enfant dans son propre contexte et sa propre pile. Par conséquent, toutes les exceptions qui se produisent dans le fil de discussion enfant ne sont pas propagées au fil de discussion appelant.
Surmonter le problème
Pour résoudre ce problème, une technique efficace consiste à employer message qui passe. Dans cette approche, un canal de communication est établi entre les threads enfants et appelants, permettant au thread enfant de transmettre des informations d'exception à son parent.
Mise en œuvre
Vous trouverez ci-dessous un exemple qui montre comment capturer les exceptions du thread enfant et les afficher dans le thread appelant :
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()
Explication
Dans cet exemple, la classe ExcThread agit en tant qu'enfant thread chargé de générer une exception. La fonction main() sert de thread appelant. Un canal de communication est établi à l'aide de l'objet queue.Queue() (appelé bucket dans le code).
Dans la méthode run() de ExcThread, toute exception qui se produit est placée dans le bucket. Le thread appelant vérifie en permanence le compartiment dans une boucle. Lorsqu'une exception est disponible dans le bucket, elle est récupérée et les détails de l'exception (type, objet et trace) sont imprimés.
Cette approche comble efficacement le fossé de communication entre le thread enfant et le thread appelant. , permettant à ce dernier d'attraper et de gérer les exceptions générées dans le premier.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!