Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Hay algunas preguntas similares, pero ninguno suministran la respuesta que necesito.

Si creo hilos a través de threading.Thread, que a su vez generen excepciones que son no controlada, esos hilos se terminan. Deseo mantener la impresión por defecto de los detalles de la excepción con el seguimiento de pila, pero trae abajo todo el proceso.

He pensado que podría ser posible capturar todas las excepciones en los hilos, y volver a subir ellos en el objeto principal de hilo, o tal vez es posible realizar manualmente el manejo de excepciones por defecto, y luego levantar una SystemExit en el hilo principal .

¿Cuál es la mejor manera de hacer esto?

¿Fue útil?

Solución

Re-lanzar excepciones en Python , incluyendo algo muy parecido esto como un ejemplo.

En el subproceso de trabajo que hacer esto (Python 2.x, ver más abajo para la versión 3.x de Python):

try:
    self.result = self.do_something_dangerous()
except Exception, e:
    import sys
    self.exc_info = sys.exc_info()

y en el hilo principal de hacer esto:

if self.exc_info:
    raise self.exc_info[1], None, self.exc_info[2]
return self.result

La excepción aparecerá en el hilo principal, justo como si hubiera sido criado en el subproceso de trabajo.

3.x Python:

try:
    self.result = self.do_something_dangerous()
except Exception as e:
    import sys
    self.exc_info = sys.exc_info()

y en el hilo principal:

if self.exc_info:
    raise self.exc_info[1].with_traceback(self.exc_info[2])
return self.result

Otros consejos

La única excepción de una rosca secundaria puede aumentar de forma fiable en el hilo principal es KeyboardInterrupt: la forma en la rosca secundaria hace es llamando a la función thread.interrupt_main() . No hay manera de asociar información adicional (sobre el motivo de la excepción) con el objeto de excepción que consigue levantó - este último es siempre a un KeyboardInterrupt llanura. Por lo tanto, es necesario para guardar la información de distancia en otro lugar, por ejemplo, en una instancia dedicada de Queue.Queue - esa información podría incluir los resultados de la rosca secundaria puede conseguir a través de sys.exc_info(), y cualquier cosa que encuentre útil, por supuesto.

El hilo principal tendrá que recuperar esa información extra (y tener en cuenta que la cola estará vacía si la interrupción de teclado es en realidad debido a que el usuario golpea control-C o similar, por lo que, el uso get_nowait y estar listo para tratar con una excepción Queue.Empty, por ejemplo), sin embargo formato que usted desee, y terminar (si todas las discusiones secundarias son daemon s, todo el proceso termina cuando el hilo principal termina).

Muy lamentablemente la respuesta aceptada no responde a la pregunta. Lo haría en lugar de tubos los detalles de la excepción en una cola. Por favor, eche un vistazo a: Catch excepción de un hilo en el hilo de llamada en Python

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top