stackoverflowexception recursive error c# exception-handling recursion

recursive - C#- ¿Cómo maneja/atrapa StackOverFlowExceptions?



system.stackoverflowexception c# (2)

Desde .NET Framework 2.0, StackOverflowException no se puede capturar. Esto se debe a que se considera una mala práctica. Citando la documentación de MSDN :

Comenzando con .NET Framework versión 2.0, un objeto de prueba-captura no puede capturar un objeto StackOverflowException y el proceso correspondiente finaliza de forma predeterminada. En consecuencia, se recomienda a los usuarios que escriban su código para detectar y evitar un desbordamiento de la pila. Por ejemplo, si su aplicación depende de la recursión, use un contador o una condición de estado para terminar el ciclo recursivo.

Ahora, la única forma de atrapar una StackOverflowException es cuando fue lanzada por el código de usuario, como se explica en un blog de Jared Parsons . Aparte de eso, al hospedar el CLR , puede manejar (pero no capturar) una StackOverflowException e idear una forma de permitir que la ejecución de su programa continúe.

Tenga en cuenta que debido a que la pila se desenrolla cuando ocurre una excepción, en las versiones anteriores a la 2.0 de .Net, la pila en realidad sería mucho más corta cuando se maneja StackOverflowException , lo que posibilita hacerlo sin generar otra StackOverflowException .

No necesito una lección para pasar de los medios recursivos a los no recurrentes, solo quiero saber por qué no podemos tratar con este tipo de excepción. De todos modos, estoy usando funciones recursivas en listas muy grandes.

He escrito un código para intentar atrapar StackOverFlowExceptions:

try { recursiveFxn(100000); } catch(Exception){}

private void recursiveFxn(int countdown) { if (countdown > 0) recursiveFxn(countdown - 1); else throw new Exception("lol. Forced exception."); }

Pero aún tengo bloqueos de programa (tanto en NUnit como en una página web que estoy ejecutando). ¿Por qué no se captura la excepción?


No puede atrapar una excepción de desbordamiento de pila porque cuando ocurre mata el hilo muerto. Try ... catch ... se realiza con el mismo hilo, por lo que no funcionará. Puede haber algunas API de nivel inferior que podría P / Invocar y tener otro hilo atraparlo. También puede haber algunas API de nivel inferior para cambiar el tamaño máximo de la pila, pero no veo nada en .NET Framework para ayudar con eso, así que de nuevo necesitaría P / Invocar algo.