¿Cuál es la forma correcta de volver a generar una excepción en C#? [duplicar]
¿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?
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
}
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.