IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Comment gérer try & catch et permettre la poursuite de l'execution ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut [C#] Comment gérer try & catch et permettre la poursuite de l'execution ?
    Bonjour à tous,

    Je me posais une question à propos du fonctionnenement de try, catch, finally.

    Jusqu'à maintenant j'ai toujours utilisé ces mots clés de façon à ce que si une exception intervient, j'arrête la routine en cours et passe à autre chose le cas échéant. Mais j'ai un problème sur un bout de code...

    Même si une exception intervient sur mon code, je voudrais que le programme continue à s'exécuter.

    Voilà mon code (sans gestion d'exception pour l'instant). Le code suivant efface tous les fichiers et sous répertoires de C:\Documents and Settings\utilisateur\Local Settings\Temp (PathToTemp), sauf les fichiers *.log à la racine.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    			DirectoryInfo DirRoot = new DirectoryInfo(PathToTemp);
    			DirectoryInfo[] DirSub = DirRoot.GetDirectories("*");
    			int NumOfSubDir = DirSub.Length;
     
                //delete all files in /temp
    			foreach (FileInfo f in DirRoot.GetFiles("*.*")) 
    			{
    				if (f.Extension != ".log")
    				{
    					f.Delete();
    				}
    			}
    			//delete all files and all subdirectories
    			for (int i = 0; i < NumOfSubDir; i++)
    			{
    				DirSub[i].Delete(true);
    			}
    Plusieurs types d'exception peuvent être lancés lors de l'utilisation de Delete.

    Ce que j'aimerais, même si j'entoure ce code d'un try{}, c'est que si un fichier ou un sous-répertoire ne peut être effacé (fichier ouvert par une autre application par exemple), je puisse continuer quand même comme si de rien n'était en continuant à effacer le reste des fichiers et sous-répertoires et laissant de coté le fichier ayant lancé cette exception.

    Comment implémenter cela ?

    J'ai regarder sur les mots clé try, catch, finally dans le SDK, mais je n'ai rien vu sur la reprise du code fautif, généralement on ressort de la fonction en l'abandonnant purement et simplement et en indiquant à l'utilisateur que quelque chose c'est mal passé, mais rien de plus.

    En vous remerciant

  2. #2
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Salut

    Premiere chose: connaitre les differentes exceptions que peut renvoyer la methode Delete de FileInfo

    Pour ca c'est pas sorcier, il y a la doc:
    http://msdn2.microsoft.com/en-us/lib...us,vs.80).aspx

    Pour le cas du fichier ouvert c'est IOException
    http://msdn2.microsoft.com/en-us/lib...io.ioexception
    Mais il y a aussi le cas ou l'utilisateur n'a pas les droits de supression sur le fichier: SecurityException
    http://msdn2.microsoft.com/en-us/lib...urityexception

    Tu peux donc faire 2 try.

    Quant a la question de continuer le traitement pour les autres fichiers meme en cas d'exception, c'est simplement une question de placement de ta gestion d'erreur dans ton code. Il suffit de placer le try/catch a l'interieur des for/each

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Merci beaucoup

    Ca répond parfaitement à ma question.

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut Re: [C#] try & catch
    Essayes cette ruse de sioux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    private void MyDelete()
     {
       DirectoryInfo DirRoot = new DirectoryInfo(PathToTemp);
     
       FileInfo[] files = DirRoot.GetFiles("*.*");
       DeleteAllFiles(files, 0);
     
       DirectoryInfo[] DirSub = DirRoot.GetDirectories("*");
       DeleteAllDirs(DirSub, 0);
     }
     
    private void DeleteAllFiles(FileInfo[] files, int index)
     {
       int i;
       try
         {
           for (i= index; i< files.Length; i++)
            {
               if (files[i].Extension != ".log")
                { files[i].Delete();}
            }
         }
       catch (Exception e)
         {DeleteAllFiles(files, i+1);}
     }
     
    private void DeleteAllDirs(DirectoryInfo[] dirs, int index)
     {
       int i;
       try
         {
           for (i= index; i< dirs.Length; i++)
            { dirs[i].Delete(true);}
         }
       catch (Exception e)
         {DeleteAllDirs(dirs, i+1);}
     }
    Pour chaque catch tu peux très bien ecrire un journal avec la liste des exceptions levées et des fichier ou dossiers non effacés

  5. #5
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Merci neguib

    Effectivement, une jolie façon de partager le travail en sous-routine, avec gestion des exceptions en prime, je te remercie beaucoup pour avoir pris le temps de me répondre.

    Ca m'a l'air parfait.

    Merci encore à tout deux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment se déroule le tri ?
    Par koyot3 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/07/2008, 13h58
  2. probleme avec try et catch
    Par salsero1 dans le forum Struts 1
    Réponses: 2
    Dernier message: 15/11/2007, 08h02
  3. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  4. UTILISATION DE TRY et CATCH
    Par demcoul dans le forum JBuilder
    Réponses: 1
    Dernier message: 15/04/2006, 15h01
  5. Pb : Exception / déroutements / try, throw, catch
    Par Bapt_from_Reims dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo