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# 1.1 Syntaxe] Comment mieux comprendre l'instruction try-catch-finally ?


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut [C# 1.1 Syntaxe] Comment mieux comprendre l'instruction try-catch-finally ?
    Bonjour à tous,

    Voici ma question. Mais tout d'abord kla structure (simplifiée)de mon programme propre a mon soucis :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while( i < titi.Count)
    {
          switch(titi[i].ToString())
          {
                 case 1 : //affectation ;
                             break;
     
                 case 2 : //autre affectation ;
                             break;
     
                 ...etc...
           }
    }

    Simple à priori ?
    Sauf qu'il arrive que lors d'un bloc affectation, des exceptions soient générées. Mais je ne veux en aucun cas que cela arrete le traitement du while, je veux parcourir tout mon titi même si une exception se déclenche. Le pb est que je ne sais pas comment mettre mes try, catch, voire finally pour réaliser ce systeme !

    A ce que j'ai compris on rentre dans le catch à la 1ere exception rencontree dans le try (dites moi si je me trompe) et une fois le catch terminé, on sort de la fonction. Le bloc finally permettrait donc d'etre réalisé que l'on soit dans le try ou le catch ! Or le bloc finally se trouverait apres le while dans la configuration suivante, comment faire pour que ma boucle s'effectue donc jusqu'à la fin , meme apres avoir rencontré des exceptions ???



    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
    while( i < titi.Count)
    {
          switch(titi[i].ToString())
          {
                 case 1 : try {  //affectation ; }
                             catch(Exception e) {.....}
                             finally{...;}
                             break;
     
                 case 2 : 
                             try {  //autre affectation ; }
                             catch(Exception e) {.....}
                             finally{...;}
                             break;
     
                 ...etc...
           }
    }

    D'avance je vous remercie pour l'aide que vous pourrez m'apporter !

    Bye !

    Nico

  2. #2
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par pi05

    A ce que j'ai compris on rentre dans le catch à la 1ere exception rencontree dans le try (dites moi si je me trompe) et une fois le catch terminé, on sort de la fonction.
    Non on ne sort pas de la fonction : on continue après le {try catch finally}. Ce qui arrète la fonction c'est le throw. (Beaucoup de gens confondent fait gaffe )

    Donc tu peut le faire comme t'a dit

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Salut, merci pour ta reponse ! Mais alors, il y'a autre chose que je ne comprends pas ! Quelle est l'utilité du bloc finally ?

    - car si tout se passe bien, on reste dans le try et on va ensuite dans le finally !
    - car si il ya un pb ds le try, on va dans le catch et on va dans le finally !

    Donc dans tout les cas, on continue le deroulement du programme (qu'il y'est le bloc finally ou non) vu que tu me dis que a la fin d'un catch on ne sort pas de la fonction ???

    Si tu peux m'eclairer sur ce point, ce serait sympa !

    Merci d'avance

  4. #4
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Non pas quand ta une exception dans le catch.

    Si ta une exception dans le catch tu sors de la methode MAIS tu execute le finally quand même

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Je concois pas le truc, tu peux copier coller la liste suivante et me dire ce que j'ai marqué est bon

    I - Juste avec un bloc try - catch

    Q: le try se passe bien ?
    R: on saute le catch et on continue la fonction !

    Q: le try genere une exception ?
    R: on ne termine pas l'execution du try mais on file direct dans le catch !

    Q : le catch se passe bien ?
    R: on sort de la fonction une fois le bloc catch terminé, ou on continue la fonction ? (vu que il n'y a pas de bloc finally, je sais pas ce qu'il se passe)

    Q : le catch genere une exception ?
    R : aucune idee !



    II- AVEC avec un bloc try - catch - finally

    Q: le try se passe bien ?
    R: on saute le catch et on va dans le finally ?

    Q: le try genere une exception ?
    R: on ne termine pas l'execution du try mais on file direct dans le catch ?

    Q : le catch se passe bien ?
    R: on va dans le bloc finally ?

    Q : le catch genere une exception ?
    R : aucune idee !

    Merci de me dire quelles reponses sont correctes ?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Moi ce que je veux faire, c'est ne pas sortir de la fonction quand je detecte une exception dans le try ! Hors, avec cette structure, j'ai l'impression qu'on ne peut pas aller + loin que le finally si ya eu une exception ds le try ! je me trompe !?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    tiens l'exemple de la MSDN

    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
    // try_catch_finally.cs
    using System;
    public class EHClass
    {
        static void Main()
        {
            try
            {
                Console.WriteLine("Executing the try statement.");
                throw new NullReferenceException();
            }
            catch (NullReferenceException e)
            {
                Console.WriteLine("{0} Caught exception #1.", e);
            }
            catch
            {
                Console.WriteLine("Caught exception #2.");
            }
            finally
            {
                Console.WriteLine("Executing finally block.");
            }
        }
    }
    Qui montre assez bien le principe.

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Oui, c'est bien comme ca que je le vois ! Mais pour ce que je veux réaliser, j'ai pas de solution vu qu'a la fin du finally, on sort de la fonction (ici un main) et que moi je veux continuer ma boucle dans laquelle je gere les exceptions. Une idee ?

  9. #9
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    Je comprend pas ta question,

    le finaly sert traditionnelemtn à refermer des ressources ouverte (typiquement fermé un fichier, une connection à une bd, ...)

    Dans ton cas chaque bloc switch doit être ds un try{}catch{} ainsi à chaque tour de boucle tu as soit un déroulement normal, soit une exception et ça jusqu'à la fin de ta boucle.

    Bref, je comprend pas ou est le problème. A un moment il faut que tu fasses des test pour voir ce que tu veux et ce que tu as.

  10. #10
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    I - Juste avec un bloc try - catch

    Q: le try se passe bien ?

    R: on saute le catch et on continue la fonction !
    oui
    Q: le try genere une exception ?
    R: on ne termine pas l'execution du try mais on file direct dans le catch !
    oui
    Q : le catch se passe bien ?
    R: on sort de la fonction une fois le bloc catch terminé, ou on continue la fonction ? (vu que il n'y a pas de bloc finally, je sais pas ce qu'il se passe)
    on continue après le catch
    Q : le catch genere une exception ?
    R : On sort de la fonction a la recherche d'un catch est si y'en a pas on termine l'execution avec une erreur.



    II- AVEC avec un bloc try - catch - finally

    Q: le try se passe bien ?
    R: on saute le catch et on va dans le finally ?
    oui
    Q: le try genere une exception ?
    R: on ne termine pas l'execution du try mais on file direct dans le catch ?
    oui et on vas dans le finally
    Q : le catch se passe bien ?
    R: on va dans le bloc finally ?
    oui
    Q : le catch genere une exception ?
    R : on vas dans le finally et on sort de la fonction a la recherche d'un autre catch et si y en n'a pas en termine l'execution du prog.

  11. #11
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par bilb0t
    Je comprend pas ta question,

    le finaly sert traditionnelemtn à refermer des ressources ouverte (typiquement fermé un fichier, une connection à une bd, ...)

    Dans ton cas chaque bloc switch doit être ds un try{}catch{} ainsi à chaque tour de boucle tu as soit un déroulement normal, soit une exception et ça jusqu'à la fin de ta boucle.

    Bref, je comprend pas ou est le problème. A un moment il faut que tu fasses des test pour voir ce que tu veux et ce que tu as.

    Oui mais c'est important de savoir comment ce déroule l'execution !! Même avec des test on peut pas prevoir tout!!

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Q : le catch se passe bien ?
    R: on sort de la fonction une fois le bloc catch terminé, ou on continue la fonction ? (vu que il n'y a pas de bloc finally, je sais pas ce qu'il se passe)
    on continue après le catch

    Voilà !!! C'est ca que je ne captais pas
    Donc en fait, on continue la fonction en sortant du catch si il n'y a pas eu d'erreur. Donc c'est exactement ce que je veux , mon catch inseerra le detail de l'exception ds un fichier journal et ma boucle peut continuer !

    Si j'ai bien compris, je peux mettre en resolu !

    Merci a tous , en particulier math !!!


    A bientot

  13. #13
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    De nada ce fut un plaisir

    Oublie pas le résolu enfin tu connais la chanson

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    of course ;-)

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

Discussions similaires

  1. Réponses: 25
    Dernier message: 15/03/2007, 19h53
  2. Comment mieux écrire ces lignes ?
    Par cobolfingaz dans le forum C#
    Réponses: 5
    Dernier message: 16/02/2007, 10h02
  3. Réponses: 5
    Dernier message: 10/07/2006, 09h31
  4. [Exemple]Mieux comprendre Primary/Foreign Key - Cardinalités
    Par tarzanchita dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 07/04/2006, 08h55
  5. [PostGreSQL/c++] Comment mieux sécuriser?
    Par HumTabipero dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 29/10/2005, 15h58

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