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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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