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 :

[Débutant]Finally, comment ça marche ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Points : 15
    Points
    15
    Par défaut [Débutant]Finally, comment ça marche ?
    Bonjour,

    J'ai du mal à comprendre l'intérêt de Finally.

    Si j'ai une séquence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try{
    .......code1
    }
    catch{
    .....code2
    }
    code 3
    Si le code1 plante, on exécute le code2. Si le code1 ne plante pas, on n'exécute pas le code2. Jusque là c'est clair.

    Mais, si code1 plante, après avoir exécuté code2, on continue sur code3, non ?

    Donc quelle différence avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try{
    .......code1
    }
    catch{
    .....code2
    }
    finally{
    ......code 3
    }
    ?

    J'en rajoute une couche... sur le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try{
    .......code1
    }
    catch{
    .....code2
    }
    finally{
    ......code 3
    }
    code4
    Quelle différence entre le code3 et le code4 ? Y a-t-il des cas où l'un des deux est exécuté et pas l'autre ?

    Merci de votre aide.

  2. #2
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Le contenu du FINALLY est TOUJOURS exécuté que tu passes dans le catch ou non, et même si le catch te sort de la méthode.

    Quelle différence entre le code3 et le code4 ? Y a-t-il des cas où l'un des deux est exécuté et pas l'autre ?
    Oui : un throw dans le catch ou un return (dans le try ou le catch)


    Tu as aussi le Try/finally : pas de catch
    J'utilise ça dans mes DAL pour fermer les connexion, etc sans attraper l'erreur qui sera gérée au niveau du business.

    n.b. : Les sujets msdn présentés, ne sont pas très parlant. l'explication de la FAQ un peu plus

  3. #3
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Pour compléter un peu, il existe aussi des exceptions spéciales qui sont automatiquement relancées à la fin du bloc catch. Par exemple, ThreadAbortException (lancé sur le thread destinataire à la suite d'un Thread.Abort()) : à la fin du bloc catch, elle est relancée, donc code4 ne sera jamais exécuté alors que code3 le sera.

    A vrai dire, je ne crois pas qu'il y ait d'autres exceptions comme celles-ci mais le problème est un peu similaire avec OutOfMemoryException : si le bloc catch tente d'instancier quelque chose alors qu'il vient de y avoir un débordement de mémoire, il est possible que ça se produise à nouveau. Là aussi, code4 ne serait donc pas exécuté.

    Par ailleurs, une bonne pratique est de ne pas attraper toutes les exceptions, seulement celles qui sont attendues et pour lesquelles on sait comment réagir (en lançant un message d'erreur adéquat par exemple). On placera donc le nettoyage proprement dit dans le finally.

    De plus, le bloc finally est sémantique, il est porteur de sens, ce qui n'est pas le cas d'un code placé après un try/catch, il rend donc le code plus explicite et compréhensible.

    Enfin, pour la culture générale, un bloc using est équivalent à ceci :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    IDispose objectToDispose = CreateAnObjectToDispose();
    try
    {
       DoSomething(objectToDispose);
    }
    finally
    {
        objectToDispose.Dispose();
    }

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    dans le cas suivant :

    try
    { }
    catch
    { }
    finally
    { }

    autre code



    si dans le try tu fais une sortie (break en c# je crois, en vb.net on a exit try, exit sub (=void) etc...) [autre code] ne sera pas exécuté, le finally si

    son utilité réside dans la possibilité de fermer des choses proprement
    parfois c'est obligatoire
    genre tu prend un verrou dans le try, et tu relaches le verrou dans le finally
    sans finally il y a un risque de ne pas exécuter la suite et donc que le verrou reste à vie, bloquant ton appli, un fichier ou autre

    le using variable end using est aussi utile dans certains cas, quelque soit le mode de sortie du using, même une erreur, la méthode dispose sera appelée (elle libère la mémoire sur des variables non managées, et permet par exemple d'être sur de fermer une connexion à une base de données, un fichier etc...)

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    En résumé, le code qu'il y a dans le bloc finally est garanti d'être exécuté quoi qu'il se passe dans le try ou dans le catch(notamment des exceptions ou un fonctionnement normal)

    Pour ton premier exemple, non en fait cela dépend si dans le code de ton catch tu régénères ou pas une exception. Si exception il y a alors tu n'exécuteras pas le code3 alors que s le code3 est dans le finally c'est garanti qu'il soit exécuté quand bien même une exception est lancée dans le catch.

    Pour ton dernier exemple c'est la même chose.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    A noter qu'il faut éviter de faire du code qui génère des exceptions dans le finally. Ca doit rester du basique. Sinon ca commence à être un sacré souk

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    un bon gros try catch dans le finally c'est fun

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    un bon gros try catch dans le finally c'est fun
    Amusant, en effet...

    Sinon, merci à tous, c'est plus clair !!

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

Discussions similaires

  1. débutant - appli java et bdd comment ça marche
    Par 123quatre dans le forum Général Java
    Réponses: 6
    Dernier message: 25/09/2008, 21h24
  2. Réponses: 10
    Dernier message: 16/02/2007, 14h51
  3. [Débutant][JTable] Comment ça marche?
    Par Nasky dans le forum Composants
    Réponses: 7
    Dernier message: 02/08/2005, 15h04
  4. [Débutant][JList] Comment ça marche dans mon cas ?
    Par gcore dans le forum Composants
    Réponses: 31
    Dernier message: 28/06/2004, 10h45
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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