Tengo una llamada de método recursivo. Cuando se lanza una excepción, me gustaría ver dónde ocurrió la pila de llamadas recursivas. Tengo un campo que contiene un "camino" que representa la pila de recursión.C#: manejo de excepciones en llamada recursiva
Ahora me gustaría agregar la información de ruta a cualquier excepción que pueda ser lanzada en la llamada recursiva.
void Recursive(int x)
{
// maintain the recursion path information
path.Push(x);
try
{
// do some stuff and recursively call the method
Recursive(x + 6);
}
catch(Exception ex)
{
if (ex is RecursionException)
{
// The exception is already wrapped
throw;
}
// wrap the exception, this should be done only once.
// save the path and original exception to the wrapper.
throw new RecursionException(path.ToString(), ex);
}
finally
{
// maintain the recursion path information
path.Pop()
}
}
Parece demasiado complicado. No hay solo un método Probablemente haya veinte o incluso más lugares donde tuve que escribir este código.
¿Hay alguna manera más simple de implementar esto?
Editar: Para señalar esto: Me gustaría tener una situación mucho más simple donde no hay una sobrecarga tal que llamar de forma recursiva del método, porque tengo muchas de esas llamadas recursivas, no sólo hay un método, hay un par de métodos recursivamente llamando entre sí, que es lo suficientemente complejo.
Así que me gustaría evitar todo el bloque try - catch, pero no veo ninguna solución para esto.
No es un gran problema para las excepciones lanzadas en mi propio código, ya que podría incluir la ruta desde el principio. Pero es un problema con cualquier otra excepción.
Editar: Las excepciones deben ser envuelto en cualquier otro código, no sólo al llamar al método recursivo:
try
{
int a = 78/x; // DivisionByZeroExeption
Recursive(x + 6);
this.NullReference.Add(x); // NullReferenceException
}
Así envolver sólo la llamada a Recusive no funciona.
existen muchos de estos métodos, con diferentes firmas, haciendo cosas diferentes, lo único común es el manejo de excepciones.
¿cuál es la diferencia entre su "ruta" y la propiedad callstack que está presente en Exception? –
La pila de llamadas solo consiste en nombres de métodos, que siempre son los mismos. En este caso, sería "Recursivo -> Recursivo -> Recursivo -> Recursivo" que no dice nada. La recursión en realidad está descendiendo por un árbol, y la ruta representa el camino a la rama actual en una forma legible por humanos. –
Haciendo todo el trabajo en métodos que se pasan a Recursive estaría envuelto en excepciones usando mi método extendido, tratar con diferentes firmas es complicado, aunque puede salirse con la suya usando genéricos para especificar tipos de parámetros, pero las firmas arbitrarias pueden no será posible sin escribir sobrecargas para cada ... –