¿Cuál es la forma correcta de volver a generar una excepción en C#? [duplicar]

Resuelto Patrick Desjardins asked hace 15 años • 9 respuestas

¿Es mejor hacer esto?

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

O esto:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

¿Hacen lo mismo? ¿Es uno mejor que el otro?

Patrick Desjardins avatar Oct 07 '08 20:10 Patrick Desjardins
Aceptado

Siempre debes usar la siguiente sintaxis para volver a generar una excepción. De lo contrario, pisotearás el seguimiento de la pila:

throw;

Si imprime el seguimiento resultante de throw ex, verá que termina en esa declaración y no en la fuente real de la excepción.

Básicamente, su uso debería considerarse un delito penal throw ex.


Si es necesario volver a lanzar una excepción que proviene de otro lugar (AggregateException, TargetInvocationException) o quizás de otro hilo, tampoco deberías volver a lanzarla directamente. Más bien existe ExceptionDispatchInfo que conserva toda la información necesaria.

try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // just to inform the compiler that the flow never leaves the block
}
Torbjörn Gyllebring avatar Oct 07 '2008 13:10 Torbjörn Gyllebring

Mi preferencia es usar

try
{
}
catch (Exception ex)
{
     ...
     throw new Exception ("Add more context here", ex)
}

Esto conserva el error original, pero le permite agregar más contexto, como un ID de objeto, una cadena de conexión y cosas así. A menudo, mi herramienta de informes de excepciones tendrá cinco excepciones encadenadas para informar, cada una de las cuales informará con más detalle.

RB. avatar Oct 07 '2008 13:10 RB.