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#] Un finally s'exécute-t-il toujours ?


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Par défaut [C#] Un finally s'exécute-t-il toujours ?
    Salut,

    j'aurais voulu un complement d'information concernant le try, catch, finally.
    En effet je me pose plusieurs questions

    si je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try{
        methodeXY();
    }
    catch(Exception ex) {
       throw ex;
    }
    finally{
     MessageBox.show("blablabla");
    }
    Est ce que en cas d'exception je verais quand meme ma message box?

    Deuxiement chose le meme code mais avec un return ds le catch et meme question.

    Merci beaucoup[/code]

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 191
    Par défaut
    le contenu du bloc finally est toujours exécuter quoiqu'il se passe, exception ou pas exception... maintenant avec un return dans le catch logiquement on sortira de la fonction sans atteindre le bloc finally. Mnt, comme disait mon prof d'algo, un return doit toujours être la dernière instruction d'une fonction au sinon vive le code de merde et vive de GOTO !!!

  3. #3
    Membre averti
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Par défaut
    Ok merci beaucoup pour ta réponse rapide.

    Pour le return je ne comptais pas en mettre ds mes catch mais c'etait pour être sur.

    Merci


    EDIT : et le fait de lancer une exceptions dans le catch, le finally s'exécutera quand meme???

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Ton MessageBox sera affiché dans tous les deux cas, exception et return dans le catch.

    C'est très simple à tester

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    en passant avec .NET 1.0 et 1.1 Thread.Abort peut stopper un finally, mais dans le 2.0 je crois que c'est réglé

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par smyley
    en passant avec .NET 1.0 et 1.1 Thread.Abort peut stopper un finally, mais dans le 2.0 je crois que c'est réglé
    Qu'est que tu entends par stopper un finally ??

  7. #7
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par L'aide
    Quand un thread appelle Abort sur lui-même, l'effet est similaire à la levée d'une exception ; ThreadAbortException se produit immédiatement et le résultat est prévisible. En revanche, si un thread appelle Abort sur un autre thread, l'abandon interrompt tout code en cours d'exécution. Il est également possible qu'un constructeur statique soit abandonné. Dans de rares cas, cela peut empêcher la création d'instances de cette classe dans ce domaine d'application. Dans les versions 1.0 et 1.1 du .NET Framework, il existe une possibilité que le thread soit abandonné alors qu'un bloc finally est en cours d'exécution, auquel cas le bloc finally est abandonné.
    Effrayant

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par smyley
    Citation Envoyé par L'aide
    Quand un thread appelle Abort sur lui-même, l'effet est similaire à la levée d'une exception ; ThreadAbortException se produit immédiatement et le résultat est prévisible. En revanche, si un thread appelle Abort sur un autre thread, l'abandon interrompt tout code en cours d'exécution. Il est également possible qu'un constructeur statique soit abandonné. Dans de rares cas, cela peut empêcher la création d'instances de cette classe dans ce domaine d'application. Dans les versions 1.0 et 1.1 du .NET Framework, il existe une possibilité que le thread soit abandonné alors qu'un bloc finally est en cours d'exécution, auquel cas le bloc finally est abandonné.
    Effrayant
    Effectivement ...
    A éviter donc

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Royd938
    Mnt, comme disait mon prof d'algo, un return doit toujours être la dernière instruction d'une fonction au sinon vive le code de merde et vive de GOTO !!!
    Avec des méthodes de 200 lignes oui. Mais celles-là doivent être coupées.
    Avec des méthodes de 10 lignes on s'en fout. Au contraire même, ça peut faire gagner en lisibilité.

  10. #10
    Membre éclairé
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Par défaut
    je deterre ce vieux topic parce que je me demande quelle est l'utilité du bloc finally étant donné que les instruction apres try catch sont forcément executées...


    Quel est votre avis sur la question.. ?

  11. #11
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Question con, ça sert à quoi un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(Exception exc)
    {
        throw(exc);
    }
    A part à masquer d'où provient effectivement l'erreur dans la trace, je vois pas....

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 71
    Par défaut
    Citation Envoyé par Mose
    Question con, ça sert à quoi un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(Exception exc)
    {
        throw(exc);
    }
    A part à masquer d'où provient effectivement l'erreur dans la trace, je vois pas....
    A faire des remontées d'exception...Par exemple :
    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
     
    private void blabla1 ()
    {
    	try
    	{
    	}
    	catch(Exception ex1)
    	{
    		throw(ex1);
    	}
    }
     
    private void blabla ()
    {
    	try
    	{
    		blabla1(); // on imagine qu'elle genere l'exception EX
    	}
    	catch(Exception ex)
    	{
    		MessageBox.Show(ex.Message); // Ici on aura normalement le message de ex1
    	}
    }
    mais j'ai quand meme un doute....si il y a qqun pour confirmé (infirmé ?)

  13. #13
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(Exception ex1)
    {
    throw(ex1);
    }


    N'a aucune utilité s'il n'y a pas de gestion spécifique de l'erreur.
    Même s'il n'y a pas de Catch, l'erreur est remonté jusqu'à la procédure appelante.

    D'ailleurs le catch n'est pas obligatoire dans un bloc Try...

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Try
      BeginUpdate
     
      '....
     
    Finally
      ' Le EndUpdate sera toujours executé même si on rencontre une exception dans le code qui suit BeginUpdate...
      EndUpdate 
    End Try

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 71
    Par défaut
    il me semble qu'en C# le catch est obligatoire. La syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try
    {
    }
    catch
    {
    }
    [finally {} ]
    en revanche, dans le bloc du catch, on peut ne rien mettre

  15. #15
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    non, en C#, le catch n'est pas obligatoire. Apres un bloc try, on doit toujours avoir soit un catch, soit un finally, mais si on a l'un, alors l'autre est optionnel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
    	// du code qui peut lancer des exceptions
    }
    finally
    {
    	// du code toujours executé
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
    	// du code qui peut lancer des exceptions
    }
    catch
    {
    	// du code executé en cas d'exception
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try
    {
    	// du code qui peut lancer des exceptions
    }
    catch
    {
    	// du code executé en cas d'exception
    }
    finally
    {
    	// du code toujours executé
    }

  16. #16
    Membre éprouvé Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    je deterre ce vieux topic parce que je me demande quelle est l'utilité du bloc finally étant donné que les instruction apres try catch sont forcément executées...
     
     
    Quel est votre avis sur la question.. ?
    pas forcément, car tu peux toujours avoir une exception dans ton bloc catch qui ne sera pas "catchée" et en séquence l'exception va remonter directement sans continuer à exécuter les instructions suivantes, même celles faisant partie de ce catch
    Dans le cas où t'as un bloc finally alors même si une exception est levée au niveau du bloc catch, le bloc finally sera toujours exécuté et c'est tout l'intérêt du bloc finally il s'exécute quoiqu'il arrive

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

Discussions similaires

  1. app windows metro js+html5 fonction pas toujours exécutée
    Par flink88 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/08/2014, 09h12
  2. [PB9] En exécutable, ImportFile retourne toujours NULL
    Par a_zoubir dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 20/12/2008, 19h02
  3. la condition s'exécute toujours.
    Par ProgVal dans le forum Langage
    Réponses: 2
    Dernier message: 29/07/2008, 10h00
  4. L'ancien code (modifié) s'exécute toujours en debug
    Par frederix quest dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/08/2007, 20h04
  5. no finalement getWidth renvoie toujours zéro. HELP !
    Par Virgile le chat dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 23/06/2007, 01h58

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