53 votes

Conditions lorsque finalement ne s’exécute pas dans un bloc .net try..finally block

En gros, j'ai entendu dire que certaines conditions feraient exploser .net après le dernier blocage. Est-ce que quelqu'un sait quelles sont ces conditions?

57voto

Haacked Points 31070

Deux possibilités:

Le bloc finally ne sera pas exécuté quand il y a un StackOverflowException car il n'y a pas de place sur la pile à même d'exécuter plus de code. Il ne sera également pas être appelé quand il y a un ExecutionEngineException, qui pourraient résulter d'un appel à l' Environment.FailFast().

15voto

Gishu Points 59012

Sauf si le CLR explose et tombe en panne avec une exception ExecutingEngineException (j'en ai vu quelques-uns dans les jours .net 1.1 avec juste ce qu'il fallait de COM Interop :) .. Je pense que finalement, il devrait toujours être exécuté.

7voto

Chris Points 513

Vous pouvez obtenir une situation où le code dans le bloc try, une SecurityException être lancée avant le bloc try entrée (au lieu de l'exception est levée lorsque le contenant méthode est appelée (voir http://msdn.microsoft.com/en-us/library/fk6t46tz(SV.71).aspx)), dans ce cas, vous ne pénètrent jamais dans le bloc try donc le code dans le bloc finally est jamais appelée.

D'autres possibilités incluent StackOverflowException, et ExecutingEngineException.

0voto

supercat Points 25534

Ni le code qui suit un bloc finally, ni de code dans des étendues extérieures, exécute sans le bloc finally avoir été commencé d'abord (une exception dans le bloc finally peut l'amener à quitter prématurément, dans ce cas, l'exécution de sauter en dehors de l'outil de finalisation à l'extérieur de la portée). Si le code avant le bloc finally est coincé dans une boucle sans fin ou une méthode qui se ferme jamais, ou si le contexte d'exécution est entièrement détruits, le bloc finally sera pas exécuté.

Notez qu'il est bon de compter sur enfin blocs, contrairement à "Finaliser" les méthodes (ou C# "destructeurs") qui ne devraient pas être valablement invoqué.

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