Tengo una llamada recursiva a un método que arroja una excepción de desbordamiento de pila. La primera llamada está rodeada por un bloque try catch pero no se detecta la excepción.
¿La excepción de desbordamiento de pila se comporta de una manera especial? ¿Puedo detectar / manejar la excepción correctamente?
No estoy seguro si es relevante, pero hay información adicional:
la excepción no se lanza en el hilo principal
el objeto donde el código está lanzando la excepción es cargado manualmente por Assembly.LoadFrom (...). CreateInstance (...)
c#
try-catch
stack-overflow
Toto
fuente
fuente
Assert.Fail
en su lugar. Muy en serio, ¿cómo lo hacemos?Respuestas:
A partir de 2.0, una excepción de StackOverflow solo se puede detectar en las siguientes circunstancias.
* "entorno alojado" como en "mi código aloja CLR y configuro las opciones de CLR" y no "mi código se ejecuta en alojamiento compartido"
fuente
Starting with 2.0 ...
, Tengo curiosidad, ¿qué les impide captar SO y cómo fue posible1.1
(lo mencionaste en tu comentario)?La forma correcta es arreglar el desbordamiento, pero ...
Puedes darte una pila más grande: -
Puede usar la propiedad System.Diagnostics.StackTrace FrameCount para contar los marcos que ha usado y lanzar su propia excepción cuando se alcanza un límite de marcos.
O puede calcular el tamaño de la pila restante y lanzar su propia excepción cuando cae por debajo de un umbral: -
Solo coge el queso. ;)
fuente
Cheese
está lejos de ser específico. Yo iría porthrow new CheeseException("Gouda");
Desde la página de MSDN en StackOverflowException s:
fuente
Como ya han dicho varios usuarios, no se puede detectar la excepción. Sin embargo, si tiene dificultades para averiguar dónde está sucediendo, es posible que desee configurar Visual Studio para que se rompa cuando se lance.
Para hacer eso, debe abrir Configuración de excepción desde el menú 'Depurar'. En versiones anteriores de Visual Studio, esto se encuentra en 'Depurar' - 'Excepciones'; en las versiones más recientes, está en 'Depurar' - 'Windows' - 'Configuración de excepciones'.
Una vez que tenga la configuración abierta, expanda 'Common Language Runtime Exceptions', expanda 'System', desplácese hacia abajo y marque 'System.StackOverflowException'. Luego, puede mirar la pila de llamadas y buscar el patrón repetido de llamadas. Eso debería darle una idea de dónde buscar para corregir el código que está causando el desbordamiento de la pila.
fuente
Como se mencionó anteriormente varias veces, no es posible detectar una StackOverflowException que el sistema generó debido a un estado de proceso dañado. Pero hay una forma de notar la excepción como un evento:
Sin embargo, su aplicación terminará después de salir de la función de evento (una solución MUY sucia fue reiniciar la aplicación dentro de este evento, jaja, no lo he hecho y nunca lo hará). ¡Pero es lo suficientemente bueno para registrar!
fuente
Sí, desde el desbordamiento de pila CLR 2.0 se considera una situación no recuperable. Entonces, el tiempo de ejecución aún cierra el proceso.
Para obtener más información, consulte la documentación http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx
fuente
StackOverflowException
termina el proceso por defecto.No puedes. El CLR no te dejará. Un desbordamiento de pila es un error fatal y no se puede recuperar.
fuente
No puedes, como explican la mayoría de las publicaciones, déjame agregar otra área:
En muchos sitios web, encontrará personas que dicen que la forma de evitar esto es utilizando un AppDomain diferente, por lo que si esto sucede, el dominio se descargará. Eso es absolutamente incorrecto (a menos que aloje su CLR) ya que el comportamiento predeterminado del CLR generará un evento KillProcess, reduciendo su AppDomain predeterminado.
fuente
Es imposible, y por una buena razón (por un lado, piense en todas las capturas (Excepción) {} alrededor).
Si desea continuar con la ejecución después del desbordamiento de la pila, ejecute código peligroso en un AppDomain diferente. Las políticas CLR se pueden configurar para terminar el AppDomain actual en caso de desbordamiento sin afectar el dominio original.
fuente