J'ai un appel récursif à une méthode qui lève une exception de débordement de pile. Le premier appel est entouré d'un bloc try catch mais l'exception n'est pas interceptée.
L'exception de débordement de pile se comporte-t-elle d'une manière spéciale? Puis-je intercepter / gérer l'exception correctement?
Je ne sais pas si cela est pertinent, mais des informations supplémentaires:
l'exception n'est pas lancée dans le thread principal
l'objet dans lequel le code lève l'exception est chargé manuellement par Assembly.LoadFrom (...). CreateInstance (...)
Assert.Fail
place. Si sérieusement - comment y parvenir?Réponses:
À partir de 2.0, une exception StackOverflow ne peut être interceptée que dans les circonstances suivantes.
* "environnement hébergé" comme dans "mon code héberge CLR et je configure les options de CLR" et non "mon code fonctionne sur un hébergement partagé"
la source
Starting with 2.0 ...
, Je suis curieux, qu'est-ce qui les empêche d'attraper SO et comment cela a-t-il été possible1.1
(vous l'avez mentionné dans votre commentaire)?La bonne façon est de corriger le débordement, mais ...
Vous pouvez vous donner un plus gros stack: -
Vous pouvez utiliser la propriété System.Diagnostics.StackTrace FrameCount pour compter les images que vous avez utilisées et lever votre propre exception lorsqu'une limite d'images est atteinte.
Ou, vous pouvez calculer la taille de la pile restante et lancer votre propre exception lorsqu'elle tombe en dessous d'un seuil: -
Attrapez juste le fromage. ;)
la source
Cheese
est loin d'être spécifique. J'irais pourthrow new CheeseException("Gouda");
À partir de la page MSDN sur StackOverflowException s:
la source
Comme plusieurs utilisateurs l'ont déjà dit, vous ne pouvez pas attraper l'exception. Cependant, si vous avez du mal à savoir où cela se passe, vous pouvez configurer Visual Studio pour qu'il s'arrête lorsqu'il est lancé.
Pour ce faire, vous devez ouvrir les paramètres d'exception dans le menu «Déboguer». Dans les anciennes versions de Visual Studio, il s'agit de «Debug» - «Exceptions»; dans les versions plus récentes, il se trouve dans «Déboguer» - «Windows» - «Paramètres d'exception».
Une fois que vous avez ouvert les paramètres, développez 'Common Language Runtime Exceptions', développez 'System', faites défiler vers le bas et cochez 'System.StackOverflowException'. Ensuite, vous pouvez consulter la pile d'appels et rechercher le modèle de répétition des appels. Cela devrait vous donner une idée de l'endroit où chercher pour corriger le code à l'origine du débordement de pile.
la source
Comme mentionné ci-dessus à plusieurs reprises, il n'est pas possible d'attraper une StackOverflowException qui a été déclenchée par le système en raison d'un état de processus corrompu. Mais il existe un moyen de remarquer l'exception en tant qu'événement:
Néanmoins, votre application se terminera après avoir quitté la fonction événementielle (une solution de contournement TRÈS sale, était de redémarrer l'application dans cet événement haha, je ne l'ai pas fait et ne le fera jamais). Mais c'est assez bon pour la journalisation!
la source
Oui à partir du débordement de pile CLR 2.0 est considéré comme une situation non récupérable. Ainsi, le runtime a toujours arrêté le processus.
Pour plus de détails, consultez la documentation http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx
la source
StackOverflowException
termine le processus par défaut.Vous ne pouvez pas. Le CLR ne vous laissera pas. Un débordement de pile est une erreur fatale et ne peut pas être récupéré.
la source
Vous ne pouvez pas, comme la plupart des articles l'expliquent, laissez-moi ajouter un autre domaine:
Sur de nombreux sites Web, vous trouverez des gens disant que le moyen d'éviter cela consiste à utiliser un autre AppDomain, donc si cela se produit, le domaine sera déchargé. C'est absolument faux (sauf si vous hébergez votre CLR) car le comportement par défaut du CLR déclenchera un événement KillProcess, faisant tomber votre AppDomain par défaut.
la source
C'est impossible, et pour une bonne raison (par exemple, pensez à tous ces catch (Exception) {} autour).
Si vous souhaitez continuer l'exécution après un débordement de pile, exécutez du code dangereux dans un autre AppDomain. Les stratégies CLR peuvent être définies pour mettre fin à AppDomain actuel en cas de dépassement de capacité sans affecter le domaine d'origine.
la source