Traitée Question stupide sur le try finally

  • dimanche 8 avril 2012 12:46
     
      A du code

    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.exe

    et je ne passe jamais dans le finally. Est ce normal ?

Toutes les réponses

  • dimanche 8 avril 2012 14:20
     
     
    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

  • dimanche 8 avril 2012 14:36
     
     

    Et bien justement non. A chaque fois que j'appuie sur F5 il reste bloqué sur la même exception et je ne passe jamais dans le finally.
    Je n'ai jamais eu ça d'ou ma question.

  • dimanche 8 avril 2012 14:48
     
     Réponse proposée A du code

    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




    • Modifié fred75 dimanche 8 avril 2012 14:51
    • Modifié fred75 dimanche 8 avril 2012 14:52
    • Modifié fred75 dimanche 8 avril 2012 14:57
    • Proposé comme réponse fred75 dimanche 8 avril 2012 14:57
    •  
  • dimanche 8 avril 2012 15:02
     
     

    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

  • lundi 9 avril 2012 07:52
     
      A du code

    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

  • lundi 9 avril 2012 07:57
     
     Traitée
    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

  • mardi 10 avril 2012 08:59
    Auteur de réponse
     
     Traitée A du code

    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.

  • mardi 10 avril 2012 09:18
     
     Traitée

    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


    fred on youTube
    PHP MySQL Web Site Creator
    fred