Ha habido un debate aquí sobre la forma correcta de volver a lanzar una excepción. Esta pregunta, en cambio, trata de cómo obtener un comportamiento útil de Visual Studio cuando se usa Rethrow.Reanudar C# una excepción: cómo obtener la pila de excepciones en el IDE?
consideran este código:
static void foo() {
throw new Exception("boo!");
}
static void Main(string[] args) {
try {
foo();
} catch (Exception x) {
// do some stuff
throw;
}
}
La excepción que sale tiene el seguimiento de la pila correcta, mostrando foo() como la fuente de la excepción. Sin embargo,, la ventana de pila de llamadas GUI solo muestra Main, mientras que esperaba que mostrara la pila de llamadas de la excepción, todo el camino hasta foo.
Cuando no hay vuelta atrás, puedo usar la GUI para navegar rápidamente por la pila de llamadas para ver qué llamada provocó la excepción y cómo llegamos allí.
Con el relanzamiento me gustaría poder hacer lo mismo. En cambio, la pila de llamadas que muestra la GUI no me sirve. Tengo que copiar los detalles de la excepción en el portapapeles, pegarlo en el Bloc de notas y luego navegar manualmente a cualquier función de la pila de llamadas que me interese.
Por cierto, obtengo el mismo comportamiento si agrego [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
o si cambio la captura a solo catch (Exception)
.
Mi pregunta es: dado que el código que tengo utiliza el re-lanzamiento, ¿alguien puede sugerir una forma conveniente de navegar por la pila de llamadas asociada con la excepción? Estoy usando Visual Studio 2010.
¿Por qué Regeneración de la excepción? ¿Hay más código en la cláusula 'catch' que no incluiste aquí? De lo contrario, creo que su solución es simplemente no atrapar la excepción. –
Robert, este es un fragmento mínimo para ilustrar el problema. El código real hace algo de trabajo antes de volver a lanzar. – redtuna