Lanzar una excepción anónima dentro de la función recursiva

Después de un par de segundos, sale el siguiente programa

El proceso finaliza debido a StackOverflowException

en lugar de mi mensaje. ¿Por qué?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;

namespace maximumVariable
{
    class Program
    {

        public static BigInteger Factorial(int num)
        {
            try
            {
                return (num > 1) ? num*Factorial(num - 1) : (1);
            }
            catch
            {
                throw;
            }
        }


        static void Main(string[] args)
        {
            BigInteger kingKong=0;
            int facParameter=0;
            try
            {

                while (true)
                {
                    kingKong = Factorial(facParameter);
                    facParameter++;
                }

            }
            catch
            {
                Console.WriteLine("The maximum value " + kingKong.ToString()+"has been achieved after "+facParameter.ToString()+" iterations");
            }


        }
    }
}

preguntado el 27 de julio de 12 a las 21:07

Nota al margen: ¿Cuál es el punto de atrapar y volver a lanzar? Factorial? (Ignorando el hecho de que no puede atrapar StackOverflowException) -

@BrianRasmussen Este código fuente debería explicarse por sí mismo; Quería comprobar el factorial máximo que puede contener BigInteger. -

El punto es que capturar una excepción solo para volver a lanzarla inmediatamente es redundante. Si no está haciendo nada con la excepción, no la atrape. -

2 Respuestas

Solo puedes atrapar un StackOverflowException en circunstancias muy específicas. Por lo tanto, su mensaje de error personalizado nunca se muestra.

Mira aquí: C # captura una excepción de desbordamiento de pila
Ver también: http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

Que tiene sentido; un desbordamiento de pila representa un estado del que es difícil proceder (en comparación con la mayoría de los otros tipos de excepciones).

contestado el 23 de mayo de 17 a las 12:05

Desde MSDN:

A partir de la versión 2.0 de .NET Framework, un objeto StackOverflowException no puede ser capturado por un bloque try-catch y el proceso correspondiente finaliza de manera predeterminada. En consecuencia, se recomienda a los usuarios que escriban su código para detectar y evitar un desbordamiento de pila. Por ejemplo, si su aplicación depende de la recursividad, use un contador o una condición de estado para terminar el bucle recursivo.

Entonces ya no puede atrapar esa excepción.

Respondido 27 Jul 12, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.