StackOverflowException en ASP.net

Apunto este snippet, como recordatorio.

image

Como indica el comentario del código, me ha ocurrido que necesitaba ejecutar una función recursiva, que recorriese un árbol en busca de un nodo.

Como mi árbol había sido construido por el usuario, y no existían validaciones que lo impidiesen, estaba realizando una búsqueda recursiva, en la que uno de los nodos hijo era a su vez padre en la misma rama.

 

image

 

Y como indica la MSDN

Starting with the .NET Framework version 2.0, a StackOverflowException object cannot be caught by a try-catch block and the corresponding process is terminated by default. Consequently, users are advised to write their code to detect and prevent a stack overflow.

el el StackOverflowException no se puede capturar en un bloque try…catch, y como consecuencia, el proceso finaliza sin más, sin hacer preguntas.

Esto, en una aplicación de escritorio, aunque es problemático, no tiene mayor repercusión, y el fallo es evidente; La aplicación se cierra sin hacer preguntas. Pero en una aplicación Asp.net, el proceso del IIS se reinicia, y hasta que te das cuenta del fallo… puede pasar mucho tiempo.

 

http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

4 comentarios en “StackOverflowException en ASP.net”

  1. Una buena practica es eliminar la recursividad siempre, y como está demostrado formalmente por la teoria de la computación que siempre es posible, no hay excusa.

    Otra cosa es que el algoritmo “desrecursivizado” te dé un time out 🙂

  2. Y porqué es buena práctica eliminar la recursividad?

    Lo pregunto más que nada porque cierto tipo de algoritmos, como cuando hay que recorrer un árbol, es bastante sencillo programarlos mediante recursividad. Vamos, yo lo utilizo bastante a menudo.

  3. Sólo por curiosidad: ¿Sabes si esto es un “bug” disfrazado de “feature”, o por el contrario se ha introducido intencionadamente en el framework?

  4. Yo no creo que sea un bug, teniendo en cuenta que en el Framework 1.1 la posibilidad de capturar la StackOverflowException si existía. Si lo han quitado, será por algo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *