Partage
  • Partager sur Facebook
  • Partager sur Twitter

try catch comment poursuivre ?

apres un bloc catch comment reprendre ou poursuivre ?

Anonyme
    3 août 2020 à 10:25:06

    Bonjours,

    J'ai du mal a comprendre comment poursuivre le reste du code après qu'une  erreur soit survenue.

    si je doit modifier comme le préconise Microsoft. sa va sacrement alourdir le code... 

    https://docs.microsoft.com/fr-fr/dotnet/standard/io/how-to-enumerate-directories-and-files

       string s_path = "c:\\repertoire";
        try
        {
            string[] files = Directory.GetFiles(@s_path, "*", SearchOption.AllDirectories);
            foreach (string file in files)
            {
                Console.WriteLine(file);
    
            }
        }
        catch //A affiner celons les erreurs rencontrer
        {
            Console.WriteLine("Erreur connue (passage aux répertoire suivant)");
            /*
                * le souci est que si le catch est déclencher l'application s’arrête
                * Il ne ser a rien de gérer l'erreur si l'application ne peux plus poursuivre
                * sauf pour en informer l'utilisateur . 
            */
        }

    merci d'avance 

    • Partager sur Facebook
    • Partager sur Twitter
      3 août 2020 à 10:43:34

      Bonjour,

      Quel est le problème ? Je ne comprends pas.

      Il y a du code qui existe après ?

      • Partager sur Facebook
      • Partager sur Twitter
        3 août 2020 à 11:57:33

        Salut,

        si il y a du code après il n'y a pas de raison que le programme s'arrête.

        Le catch est déclenché quand une exception est déclenché dans le try. Donc le code sort du try, entre dans le catch puis passe a la ligne suivante.

        • Partager sur Facebook
        • Partager sur Twitter
          3 août 2020 à 13:21:46

          On ne met un try/catch que s'il y a quelque chose "d'utile" à faire lors d'une exception. Ce qui est extrêmement rare dans les faits.

          Et faire un catch "général" n'est jamais une bonne idée. La documentation M$ est une documentation, pas un exemple de "bonnes pratiques".

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          Anonyme
            3 août 2020 à 18:19:17

            j'ai oublier de préciser que 

            string[] files = Directory.GetFiles(@s_path, "*", SearchOption.AllDirectories);


            c'est une  methode qui ce "rappelle" la ligne suivante est donc la même .... d'ou le problème.

            pour les erreur celle qui son connue:

                    catch (DirectoryNotFoundException dirNotFound)
                    {
                        Console.WriteLine($"{dirNotFound.Message}");
                    }
                    catch (UnauthorizedAccessException unAuthDir)
                    {
                        Console.WriteLine($"unAuthDir: {unAuthDir.Message}");
                    }
                    catch (PathTooLongException longPath)
                    {
                        Console.WriteLine($"{longPath.Message}");
                    }



            Merci pour vos réponse

            • Partager sur Facebook
            • Partager sur Twitter
              3 août 2020 à 18:24:31

              Ok pour les blocs catch, mais pouvez-vous poster le "vrai" bloc try ?
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              Anonyme
                3 août 2020 à 19:55:56

                D'après ce que j'ai trouver comme informations c est pas possible, il faudrait gérer cela dans la callback cependant, ce code est celui de microsoft et donc inaccessible. il faut donc faire autrement.

                bacelar tout est donner je ne peux pas faire plus. ce code est compilable. et exécutable. enfin si l'erreur arrive on devine la suite. 

                • Partager sur Facebook
                • Partager sur Twitter
                  3 août 2020 à 21:58:52

                  Les exemples de la documentation M$ n'utilisent pas GetFiles pour des énumérations car ce n'est pas adapté pour.

                  C'est quoi votre "vrai" besoin ?

                  Si c'est de l'énumération, utilisez l'un des exemples. Ils ne sont pas parfaits mais on aura une base plus proche de la réalité.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  Anonyme
                    4 août 2020 à 4:11:39

                    bacelar a écrit:

                    Les exemples de la documentation M$ n'utilisent pas GetFiles pour des énumérations car ce n'est pas adapté pour.

                    C'est quoi votre "vrai" besoin ?

                    Si c'est de l'énumération, utilisez l'un des exemples. Ils ne sont pas parfaits mais on aura une base plus proche de la réalité.

                    La fonction utilisée GetFiles  n'est pas gérable. c'est une callback. un block try catch ne peux pas gérer ce type d'erreur car la même erreur peut survenir, mai pas sur le même chemin 'accès.

                    Connaitre le besoins n'est pas utile, car cela serai une alternative et non la solution aux problème citer sur le topic 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 août 2020 à 12:06:48

                      Faux problème, on utilise les primitives aux besoins.

                      Si les cas d'erreurs sont exceptionnels, vous analysez le message d'erreur et vous appliquez une stratégie d'énumération alternative.

                      Il n'y a pas de notion de "callback" en jeu dans cette primitives .NET.

                      C'est quoi votre "vrai" besoin ? (BIS)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      Anonyme
                        4 août 2020 à 12:56:18

                        bacelar a écrit:

                        Il n'y a pas de notion de "callback" en jeu dans cette primitives .NET.


                        Faux: fait donc un essais et met un point sur cette methode tu verras qu'elle ce rappelle. 

                        bacelar a écrit:

                        Faux problème, on utilise les primitives aux besoins

                        Quoi ?? il n'est pas question de besoins ni d'alternative. je pense que t'a même pas tester ça commence a ce voir....!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 août 2020 à 14:37:06

                          Bon, @LafouineRox, tu peux être plus clair (et laisser Win32 là où il doit être) ?

                          Ce code affiche l'ensemble des fichiers et répertoire du répertoire "C:\tmp" :

                          using System;
                          using System.IO;
                          
                          namespace ConsoleApp1
                          {
                              class Program
                              {
                                  static void Main(string[] args)
                                  {
                                      string s_path = "C:\\tmp";
                                      try
                                      {
                                          string[] files = Directory.GetFiles(@s_path, "*", SearchOption.AllDirectories);
                                          foreach (string file in files)
                                          {
                                              Console.WriteLine(file);
                          
                                          }
                                      }
                                      catch (DirectoryNotFoundException dirNotFound)
                                      {
                                          Console.WriteLine($"{dirNotFound.Message}");
                                      }
                                      catch (UnauthorizedAccessException unAuthDir)
                                      {
                                          Console.WriteLine($"unAuthDir: {unAuthDir.Message}");
                                      }
                                      catch (PathTooLongException longPath)
                                      {
                                          Console.WriteLine($"{longPath.Message}");
                                      }
                                      Console.ReadKey();
                                  }
                              }
                          }

                          Donc, c'est quoi TON problème ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          Anonyme
                            4 août 2020 à 22:11:27

                            A la première erreur il s’arrête.  Comment faire pour éviter cela ? 

                            j'ai lancer sur la racine c:\ car les droit son plus présent  mai sa va pas très loin. !

                            unAuthDir: Access to the path 'C:\Config.Msi' is denied.


                            voila c'est plus claire ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 août 2020 à 1:49:42

                              Je ne vois toujours pas pourquoi vous vous enquiquinez avec cette primitive qui ne semble pas correspondre à vos besoins, qui vous n'exprimez pas d'ailleurs. 

                              Exemple d'utilisation de ce machin pour le cas qui ne correspond pas à son véritable usage :

                              using System;
                              using System.Collections.Generic;
                              using System.IO;
                              using System.Linq;
                              
                              namespace ConsoleApp1
                              {
                                  class Program
                                  {
                                      static List<string> GetAllFiles(string root)
                                      {
                                          var retval = new List<string>();
                              
                                          try
                                          {
                                              string[] files = Directory.GetFiles(root, "*", SearchOption.AllDirectories);
                                              retval = files.ToList();
                                          }
                                          catch (DirectoryNotFoundException dirNotFound)
                                          {
                                              Console.WriteLine($"{dirNotFound.Message}");
                                          }
                                          catch (UnauthorizedAccessException unAuthDir)
                                          {
                                              string[] files = null;
                                              try
                                              {
                                                  files = Directory.GetFiles(root, "*", SearchOption.TopDirectoryOnly);
                                              }
                                              catch (UnauthorizedAccessException unAuthAcc)
                                              {
                                                  Console.WriteLine($"unAuthDir: {unAuthAcc.Message}");
                                                  retval.Add(root);
                                                  return retval;
                                              }
                                              retval.AddRange(files);
                              
                                              var dirs = Directory.GetDirectories(root);
                                              foreach(var dir in dirs)
                                              {
                                                  var fileList = GetAllFiles(Path.Combine(root, dir));
                                                  retval.AddRange(fileList);
                                              }
                                          }
                                          catch (PathTooLongException longPath)
                                          {
                                              Console.WriteLine($"{longPath.Message}");
                                          }
                              
                                          return retval;
                                      }
                                      static void Main(string[] args)
                                      {
                                          string s_path = "C:\\";
                              
                                          var files = GetAllFiles(s_path);
                              
                                          foreach(var file in files)
                                          {
                                              Console.WriteLine(file);
                                          }
                                          Console.ReadKey();
                                      }
                                  }
                              }
                              



                              • Partager sur Facebook
                              • Partager sur Twitter
                              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                              Anonyme
                                5 août 2020 à 12:08:59

                                Merci pour ta réponse constructive, je te rejoins sur le faite que c'est pas  adapter.  

                                je résume :

                                Tu doit stocker , la rappeler jusqu’à que ça ce termine, tu prend le dessus en bouclant à sa place grâce à ta boucle principal dans le main. de cette manière tu la gères.  

                                De cette manière elle montre sa problématique:(GetFiles) 

                                ---------

                                Le code que j'ai poster aux départ aurais suffi.  mai sans stoker.

                                le seul fait d'avoir une erreur montre clairement que le try catch déplace le problème  s'il ne peux pas le résoudre a ça source.  

                                si dans GetFiles tu aurais pu la modifier, tu n'aurai pas a avoir besoins de stocker les données pour que  ça passe.

                                Dans ce cas de figure c est pas possible. Le try catch ne remplis pas son rôle correctement, car il n'est pas aux bon endroit .

                                j'éspère avoir été claire ce qui est loins d' être évident.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 août 2020 à 12:46:39

                                  Non.

                                  C'est juste que tu me forces à utiliser un truc qui n'est pas fait pour.

                                  GetFiles, c'est pour récupérer des fichiers dans une arborescence qu'une application est sensés "maitrisée" et c'est très pratique dans ce cas là.

                                  Je ne fais qu'implémenter un scan de fichiers "raisonnable" dans le catch.

                                  Mais des manière plus efficaces, il y en a plein et tu as même posté un lien qui en resence pas mal, dans ton message initial.

                                  >try catch déplace le problème

                                  Le problème, c'est que tu n'utilises pas les bonnes primitives pour ce que tu veux faire (ce que tu nous as toujours pas communiqué)

                                  >s'il ne peux pas le résoudre a ça source.

                                  Le framework .NET est Open Source, si tu veux le modifier, libre à toi. Mais commences par redéfinir avec tes propres primitives.

                                  >tu n'aurai pas a avoir besoins de stocker les données pour que  ça passe.

                                  Si, mais cela ne présente aucun intérêt.

                                  >Le try catch ne remplis pas son rôle correctement

                                  Le quel ? Pour moi, il fait très bien son taf.

                                  Commences par spécifier ta méthode "GetFiles" qu'on voit si elle est vraiment utile et pratique. Après, l'implémentation, c'est pas un problème.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                  Anonyme
                                    5 août 2020 à 15:49:06

                                    Décidément c'est difficile de me faire comprendre. et par écrit ça risque de durer pas mal de temps. je considère le post comme résolut et je voudrai pas monopoliser la tête du forum c'est pas sympa pour les autres personnes qui post.

                                    Merci pour ta réponse. ainsi que ceux qui ce sont intéresser aux sujet.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    try catch comment poursuivre ?

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown