2009-08-20 17 views
9

¿Es legal y seguro en C# capturar una excepción en un hilo y luego volver a tirarlo en otro?¿Puedes volver a lanzar una excepción .NET en un hilo diferente?

E.g. es esto legal

Exception localEx = null; 

Thread mythread = new Thread() {() => 
        { 
         try 
         { 
          DoSomeStuff(); 
         } 
         catch(Exception ex) 
         { 
          localEx = ex; 
         } 
        }); 

myThread.Start(); 
... 
myThread.Join(); 

if(localEx != null) 
    throw localEx; // rethrow on the main thread 

Creo que es legal, pero tengo problemas para encontrar cualquier doco que lo pruebe. Lo más parecido que encontré fue una breve mención de la transferencia de excepciones entre hilos aquí: http://msdn.microsoft.com/en-us/library/ms229005.aspx

+0

¿Se puede pasar un objeto de un hilo a otro? – Partial

+0

@Partial: por supuesto que puedes. –

Respuesta

11

Sí, es legal. Las excepciones son (generalmente hablando) objetos descriptivos sin afinidad de hilos.

Usted sería mejor de envolver su excepción de rosca en una nueva excepción:

throw new Exception("Something descriptive here", localEx); 

De esta manera, se mantendrá el seguimiento de la pila en localEx (como el InnerException de la nueva excepción).

+1

-1: ¿Está planeando agregar una cita? Si es así, votaré luego. –

+0

Su respuesta fue "sí, es legal". Creo que se requiere más que eso. Has expandido tu respuesta hasta el punto donde no es necesario el downvote. –

+0

Gracias por señalar eso. Lo haré. –

2

No veo por qué no funcionaría, pero debe recordar que en realidad no está volviendo a lanzar la excepción. Está lanzando una nueva excepción, que resulta ser el mismo objeto de excepción. Entonces, por ejemplo, la traza de la pila dirá que fue lanzada desde "throw localEx;" en lugar de donde sea que provenga la excepción original.

+0

Gracias. Sí, re-lanzar fue la palabra incorrecta. Usaré localEx como excepción interna para evitar el problema de la pila de llamadas que mencionas. –

3

Lo que estás haciendo no es un nuevo intento. Es un nuevo lanzamiento de una instancia de excepción que tenía en una variable. Incluso si estuviera usando solo un hilo, sería una mala idea, ya que hace que la excepción parezca venir del sitio "throw". Con múltiples hilos, no tengo idea de cómo alguien se daría cuenta de que hubo un cambio de hilo.

2

Es legal y no es un volver a lanzar, es una nueva excepción de ser lanzado en el otro hilo (con el mismo objeto de excepción)

3

Absolutamente. System.AggregateException se agrega a .NET 4 específicamente para ese propósito durante operaciones paralelas.

0

No sé por qué crees que no es legal. Si fuera ilegal seguramente el compilador atraparía o el tiempo de ejecución arrojaría una excepción. De hecho, uso este patrón. @John En una aplicación de formularios de Windows que llama a servicios web usando un hilo de fondo, lo uso de esta manera. La excepción se maneja luego en el manejador de nivel superior Application.ThreadException, se registra, etc. No es necesario saber en qué hilo se produjo la excepción.

Cuestiones relacionadas