259 votes

Que se passe-t-il si un enfin bloc lève une exception ?

Si un enfin bloc lève une exception quel exactement qui se passe ?

414voto

Henk Holterman Points 153608

Si un bloc finally déclenche une exception ce qui exactement qui se passe ?

Cette exception se propage à l'extérieur et vers le haut, et va (peut) être traitées à un niveau supérieur.

Votre bloc finally sera pas être rempli au-delà du point où l'exception est levée.

Si le bloc finally est exécuté lors de la manipulation de l'autre exception, alors que la première exception est perdu.

C# 4 Spécification du Langage § 8.9.5: Si le bloc finally jette une autre exception, le traitement de l'exception en cours est terminée.

99voto

0xA3 Points 73439

Pour des questions comme j'ai l'habitude d'ouvrir un vide projet d'application console dans Visual Studio et à écrire un petit programme d'exemple:

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            try
            {
                throw new Exception("exception thrown from try block");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Inner catch block handling {0}.", ex.Message);
                throw;
            }
            finally
            {
                Console.WriteLine("Inner finally block");
                throw new Exception("exception thrown from finally block");
                Console.WriteLine("This line is never reached");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Outer catch block handling {0}.", ex.Message);
        }
        finally
        {
            Console.WriteLine("Outer finally block");
        }
    }
}

Lorsque vous exécutez le programme, vous verrez l'ordre exact dans lequel catch et finally des blocs sont exécutés. Veuillez noter que le code dans le bloc finally après l'exception est levée ne sera pas exécutée (en fait, dans cet exemple de programme Visual Studio va même vous avertir qu'il a détecté un code non accessible):

Bloc catch interne de la manipulation exception levée du bloc try.
Intérieure bloc finally
Bloc catch externe de manipulation exception levée du bloc finally.
Externe bloc finally

Remarque Additionnelle

Comme Michael Damatov souligné, à l'exception de l' try bloc va être "mangé" si vous n'avez pas le manipuler dans un (intérieure) catch bloc. En fait, dans l'exemple ci-dessus, le re-levée d'une exception n'apparaît pas dans le bloc catch externe. Pour le rendre encore plus clair oeil à ce qui suit légèrement modifiée de l'échantillon:

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            try
            {
                throw new Exception("exception thrown from try block");
            }
            finally
            {
                Console.WriteLine("Inner finally block");
                throw new Exception("exception thrown from finally block");
                Console.WriteLine("This line is never reached");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Outer catch block handling {0}.", ex.Message);
        }
        finally
        {
            Console.WriteLine("Outer finally block");
        }
    }
}

Comme vous pouvez le voir à partir de la sortie de l'exception interne est "perdu" (c'est à dire ignoré):

Intérieure bloc finally
Bloc catch externe de manipulation exception levée du bloc finally.
Externe bloc finally

10voto

Guffa Points 308133

S’il y a une exception dans l’attente (lorsque le bloc a une byt aucune `` ), la nouvelle exception remplace celui-là.

S’il n’y a aucune exception dans l’attente, ça marche tout aussi lever une exception en dehors de la `` bloc.

4voto

Darin Dimitrov Points 528142

L’exception est propagée.

1voto

Doug Coburn Points 53

Lever une exception lorsqu’une autre exception est active se traduira par la première exception obtenant remplacée par la deuxième exception (plus tard).

Voici un code qui illustre ce qui se passe :

  • Exécuter le code et vous verrez « deuxième exception »
  • Supprimez les instructions try et catch et vous verrez « première exception »
  • Supprimez également le lancer ; Déclaration et vous verrez à nouveau « deuxième exception ».

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