139 votes

C# attraper une exception de dépassement de pile

J'ai reçu un appel récursif à une methode que jeter une exception de dépassement de pile. Le premier appel est entouré par un bloc try catch mais l'exception n'est pas pris.

Faire l'exception de dépassement de pile se comporter d'une manière spéciale ? Puis-je attraper/gérer correctement l'exception ?

NB : le cas échéant :

  • l'exception n'est pas jeté dans le thread principal

  • l'objet où le code est en train de jeter l'exception est chargé manuellement par l'Assemblée.LoadFrom(...).CreateInstance(...)

119voto

JaredPar Points 333733

En commençant par un 2.0 StackOverflow Exception ne peut être pris que dans les circonstances suivantes.

  1. Le CLR est en cours d'exécution dans un environnement hébergé, où l'hôte autorise expressément StackOverflow exceptions à être manipulés
  2. Le stackoverflow exception est levée par le code de l'utilisateur et n'est pas due à un débordement de pile situation (Référence)

47voto

Damien_The_Unbeliever Points 102139

À partir de la page MSDN sur StackOverflowExceptions:

Dans les versions antérieures du .NET Cadre, votre demande pourrait attraper un objet StackOverflowException (par exemple, pour récupérer à partir de la surabondance de la récursivité). Cependant, que la pratique est actuellement déconseillée en raison supplémentaire significative de code est nécessaires à la fiabilité de l'attraper une pile exception de dépassement de capacité et de continuer l'exécution du programme.

En commençant par la .NET Framework la version 2.0, une StackOverflowException l'objet ne peut pas être attrapé par un try-catch le bloc et le processus correspondant est résilié par défaut. Par conséquent, les utilisateurs sont invités à écrire leur code pour détecter et prévenir une pile dépassement de capacité. Par exemple, si votre l'application dépend de la récursivité, utiliser d'un comptoir ou d'une condition de l'état de mettre fin à la boucle récursive. Note qu'une application qui héberge le common language runtime (CLR) peut spécifier que le CLR décharger le domaine d'application où la pile exception de dépassement de capacité se produit et laissez-le processus correspondant continuer. Pour plus d'informations, voir ICLRPolicyManager Interface et Hébergement le Common Language Runtime.

31voto

Simon Points 9025

Comme plusieurs utilisateurs ont déjà dit, vous ne pouvez pas intercepter l'exception. Toutefois, si vous avez du mal à trouver où ça se passe, vous souhaiterez peut-être configurer visual studio à la rupture quand il est lancé.

Pour ce faire, choisissez "Exceptions" dans le menu Déboguer, développez 'Common Language Runtime Exceptions", développez Système, faites défiler vers le bas et cochez la case 'Système.StackOverflowException'. Ensuite, vous pouvez regarder la pile d'appel et de rechercher le motif de répétition des appels. Cela devrait vous donner une idée de où chercher à corriger le code qui est à l'origine du débordement de la pile.

7voto

Brian Rasmussen Points 68853

Oui à partir de CLR 2.0 débordement de pile est considéré comme un non-récupérables situation. Si le moteur d'exécution toujours arrêter le processus.

Pour plus de détails, voir la documentation http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X