Meilleur auteur de réponses
Question stupide sur le try finally

Question
-
Bonjour,
J'avais un fonctionnement bizarre sur un programme à cause d'une exception et du coup j'ai commencé à me poser des questions sur le méchanisme d'exceptions.
J'essaye donc le code ci-dessous :
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { int i = 123; string s = "Some string"; object o = s; try { // Invalid conversion; o contains a string not an int i = (int)o; } finally { Console.Write("i = {0}", i); } System.Diagnostics.Debug.WriteLine("fsdfsdf"); } } }
Et quand je lance ca me sort une exception et a chaque fois que je clique sur F5 ca m'affiche le message suivant
Une exception de première chance de type 'System.InvalidCastException' s'est produite dans ConsoleApplication2.exeet je ne passe jamais dans le finally. Est ce normal ?
Réponses
-
Maintenant, dans votre exemple, exécutez le code en mode sans déboguage (Ctrl+F5) et quand la fenêtre d'erreur apparait, appuyez sur Annuler, vous verrez qu'avant de se terminer, l'appli exécute bien le code du finally.
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone- Proposé comme réponse Ould MouradEditor mardi 10 avril 2012 14:17
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15
-
Bonjour,
Je ne voie pas comment pouvez vous ne pas passer dans le finally, pour en avoir la certitude placez y une instruction Cosole.ReadKey pour faire une pause :
finally { Console.Write("i = {0}", i); Console.ReadKey(); }
Comme l'exception n'est pas catchée vous n'avez pas le temps de voir que l'instruction Console.Write a été exécutée
Cordialement.
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15
-
Bonjour Vincent,
C'est pour cela qu'il y a une rubrique Suggestions dans les articles MSDN afin de corriger des erreurs
http://msdn.microsoft.com/fr-fr/library/zwc8s4fz(v=vs.80).aspx
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15
Toutes les réponses
-
Oui, en mode debug, dans VS, il s'arrête sur toute les execeptions, mais vous pouvez continuer en faisant F5 de nouveau et il passera dans le finally
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone -
-
Bonjour vincent,
Il manque le catch dans ton Try Finally
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int i = 123; string s = "some string"; object o = s; try { // Invalid conversion; o contains a string not an int i = (int)o; } catch(Exception e ) { Console.WriteLine(e.Message); } finally { Console.Write("i = {0}", i); } System.Diagnostics.Debug.WriteLine("fsdfsdf"); Console.ReadKey(); } } }
fred on youTube
PHP MySQL Web Site Creator
fred
-
moi je veux bien qu'il manque un catch mais du coup pourquoi on a ca alors :
http://msdn.microsoft.com/fr-fr/library/zwc8s4fz(v=vs.80).aspx
-
Oops, désolé, faut que je lise correctement ;-).
Je pense qu'un meilleur code serait de ce style :
static void Main(string[] args) { try { Method("coucou"); } catch (Exception ex) { Console.WriteLine("dans le catch"); throw; } Console.ReadLine(); } private static void Method(object o) { int i = 123; try { Console.WriteLine("avant erreur"); i = (int)o; } finally { Console.WriteLine("dans le finally"); } }
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone -
Maintenant, dans votre exemple, exécutez le code en mode sans déboguage (Ctrl+F5) et quand la fenêtre d'erreur apparait, appuyez sur Annuler, vous verrez qu'avant de se terminer, l'appli exécute bien le code du finally.
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone- Proposé comme réponse Ould MouradEditor mardi 10 avril 2012 14:17
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15
-
Bonjour,
Je ne voie pas comment pouvez vous ne pas passer dans le finally, pour en avoir la certitude placez y une instruction Cosole.ReadKey pour faire une pause :
finally { Console.Write("i = {0}", i); Console.ReadKey(); }
Comme l'exception n'est pas catchée vous n'avez pas le temps de voir que l'instruction Console.Write a été exécutée
Cordialement.
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15
-
Bonjour Vincent,
C'est pour cela qu'il y a une rubrique Suggestions dans les articles MSDN afin de corriger des erreurs
http://msdn.microsoft.com/fr-fr/library/zwc8s4fz(v=vs.80).aspx
- Marqué comme réponse Ciprian Duduiala jeudi 12 avril 2012 07:15