Si un enfin bloc lève une exception quel exactement qui se passe ?
Réponses
Trop de publicités?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.
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
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 ».