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

Langage Delphi Discussion :

Question sur la particularité de la gestion des exceptions


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut Question sur la particularité de la gestion des exceptions
    Bonjour tout le monde,

    Ben oui à défaut de pouvoir se chauffer les miches au soleil, je fais chauffer les 2 neurones qui me restent ... Et j'ai une question qui me turlupine depuis un petit moment à vous soumettre:

    Ca concerne la structure de gestion des exceptions et plus particulièrement le fameux bloc:

    TRY
    ...
    FINALLY
    ...
    END;

    Bon comme tout le monde, j'ai lu un peu partout que cette structure assure dans tous les cas l'exécution des instructions comprises entre le FINALLY et le END, erreur ou pas erreur...

    OK mais j'ai un sérieux doute dans le cas d'un bout de code qui ressemblerait à celui ci 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
     
    procedure Tartempion(const FileName: string; const: NombreX: DWord);
    var 
      RAMStream : TMEmoryStream;
      zahler : dword;
    begin
      RAMStream :=  TMEmoryStream.Create;
      RAMStream.LoadFromFile(FileName);
      try
      for zahler := 0 to NombreX do
         begin
            Intruction N... ;
            procedure X;
           if not ValueX or evenement Z then exit;
         end;
      finally
         RAMStream.Free;
    end;
    A cause de l'instruction Exit placé dans la boucle - et qui donc force une sortie immédiate de la procédure dans le cas où le test if réussit -, j'ai vraiment un super gros doute que les instructions placées dans le finally end; soient exécutées... puisque cet exit équivaut à un GOTO (qui n'en a pas le nom)

    Quelqu'un parmi vous pourrait-il éclairer ma lanterne à ce sujet ? Merci d'avance et A+++

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    Il suffit de faire un code test qui reproduise la séquence et permette de valider le passage dans le finally :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TestFinally(aSortie: Boolean);
    var
      i: integer;
    begin
      try
        for i:=1 to 100
        do begin
          if (i>200) or aSortie
          then Exit;
        end;
      finally
        ShowMessage('J''y passe !');
      end;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Penser que Try..Finally est un gestionnaire d'exception est la première erreur. A ne pas confondre avec Try..Except
    C'est un bloc de code exécuté quelque soit le mode de sortie : exception, exit, break. Il est inconditionnel.

    Exit n'est pas un Goto (saut à une adresse). Exit demande d'ignorer le code suivant jusqu'à la sortie de la procédure, mais il ne déroge pas au contrôle de flux imposé par un bloc Finally.
    Avec Goto, il n'est d'ailleurs pas possible d'entrer ou de sortir d'un bloc Try.

    Il y a une erreur dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RAMStream := TMemoryStream.Create;
    RAMStream.LoadFromFile(FileName);
    try
      ...
    finally
       RAMStream.Free;
    end;
    Rien ne dit en effet que le fichier existe ou qu'il n'est pas verrouillé (exclusif) et que LoadFromFile ne pourrait pas échoué. Cet appel devrait être dans le Try sous peine de ne pas libérer RamStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RAMStream := TMemoryStream.Create;
    try
      RAMStream.LoadFromFile(FileName);
      ...
    finally
       RAMStream.Free;
    end;
    on crée l'objet et on "blinde" tout appel.

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Ben oui à défaut de pouvoir se chauffer les miches au soleil, je fais chauffer les 2 neurones qui me restent ... Et j'ai une question qui me turlupine depuis un petit moment à vous soumettre:
    Ca commence bien, avec 2 neurones, on va pas aller loin

    Penser que Try..Finally est un gestionnaire d'exception est la première erreur. A ne pas confondre avec Try..Except
    eh oui... on parle de bloc de protection de ressource.

    Pour ta question, c'est expliqué dans la documentation standard.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut
    Re,

    Un grand merci à vous trois pour les précisions concernant l'utilisation de cette structure... Réponses et explications plus que pertinentes. Je vais donc mettre de suite vos suggestions en oeuvre.

    (je viens de gagner un neurone de plus... Nom de dieu ça va barder...

    Bonne continuation et A+++

    Affaire classée.

  6. #6
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Enfin un sujet que j'ai compris de A à Z.
    Faut dire, ni P.Toth ni le S.LeTroll ne sont passés par là.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Enfin un sujet que j'ai compris de A à Z.
    Faut dire, ni P.Toth ni le S.LeTroll ne sont passés par là.
    quoi ? nos explications ne sont pas limpides ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    quoi ? nos explications ne sont pas limpides ?!
    Ha si elles le sont, mais faut avoir un bon niveau !

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

Discussions similaires

  1. Petite question sur la gestion des exception
    Par Wizard50 dans le forum C#
    Réponses: 1
    Dernier message: 05/05/2010, 09h17
  2. [Framework] Question sur la gestion des exceptions et du @Transactional
    Par franckbis dans le forum Spring
    Réponses: 0
    Dernier message: 13/01/2010, 11h53
  3. Réponses: 7
    Dernier message: 17/02/2007, 09h22
  4. [PEAR][Auth] Question sur la doc et la gestion des sessions
    Par nathieb dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/11/2006, 19h35
  5. [Exception]Gestion des exceptions, capture sur la classe.
    Par @lantis dans le forum Général Java
    Réponses: 9
    Dernier message: 22/07/2005, 19h43

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