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 :

gestion des exceptions


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut gestion des exceptions
    Bonsoir

    Pour gérer une exception, on a 2 solutions
    Avec try..finally, les instructions du second bloc d'instruction sont toujours exécutées.
    Avec try..except, les instructions du second bloc d'instruction ne sont exécutées que s'il y a eu une exception dans le bloc protégé. Le couple try..except propose en plus de traiter l'exception en fonction de sa classe.

    Mon pb, c'est que si je choisis la 1ère solution, par sécurité, par exemple pour être sûr de libérer un objet créé dans le 1er bloc d'instructions, je ne peux pas traiter l'exception à ma guise en fonction de sa classe
    En plus, on a droit à un immonde message d'erreur incompréhensible pour le prophane : par ex '§ n'est pas une valeur entière correcte'

    Est-il possible de combiner les 2 méthodes, c'est à dire à la fois gérer l'exception avec un et s'assurer qu'un bloc d'instruction sera toujours exécuté ?
    Choisir, c'est renoncer...

  2. #2
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Si je traduis bien ta question, tu souhaites faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // code non valide !!
    Try
    ...
    Except
    ...
    Finally
    ...
    End;
    tu peux essayer d'enchainer 2 blocs l'un dans l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Try
      Try
      ...
      Except
      ...
      End;
    Finally
    ...
    End;
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Pour gérer une exception, il n'y a qu'une possibilité, try..except .

    Try..finally n'est pas lié aux exceptions mais permet d'executer du code quel que soit le mode de sortie du bloc. ça peut bien sûr être dû à une exception, mais aussi à un Exit, Break, etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    begin
      try
        Exit;
      finally
        ShowMessage('Je suis exécuté malgré l''Exit');
      end; //<-- Exit effectif ici
     
      ShowMessage('Je ne suis jamais exécuté');
    end;

  4. #4
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par andnotor
    Pour gérer une exception, il n'y a qu'une possibilité, try..except .

    Try..finally n'est pas lié aux exceptions mais permet d'executer du code quel que soit le mode de sortie du bloc. ça peut bien sûr être dû à une exception, mais aussi à un Exit, Break, etc.
    Très juste
    La rectification est importante, je m'étais mal exprimé

    Citation Envoyé par archonte
    tu peux essayer d'enchainer 2 blocs l'un dans l'autre
    Simple et efficace

    Je me demande quand même comment font les pros

    Merci pour votre aide
    Choisir, c'est renoncer...

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Variante réalisant la combinaison :

    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
    label Achever;
    begin
                 Try
                     ...
                     GoTo Achever;
                 Except
                     on EMonErreur do 
                     begin ShowMessage('Exception'); 
                           GoTo Achever; 
                     end;
                 end;
     
               Achever:
                    instructions pour achever finalement
                    ShowMessage('Finally'); 
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Le code de Archonte n'est utile que si l'exception est remontée (Raise). Sinon finally ne sert à rien puisque l'exception a déjà été gérée .

    Sinon, on fera l'inverse. protection du code avant gestion de l'exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      try
      finally
      end;
    except
    end;
    Gilbert, je ne vois pas bien l'utilité de ton label goto .

  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 Andnotor Voir le message
    Le code de Archonte n'est utile que si l'exception est remontée (Raise). Sinon finally ne sert à rien puisque l'exception a déjà été gérée .

    Sinon, on fera l'inverse. protection du code avant gestion de l'exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      try
      finally
      end;
    except
    end;
    les deux mon capitaine tout dépend de ce que tu veux traper

    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 traitement;
    begin
      obj := TObject.Create;
      try
        try
          obj.Proc;
        except
          ShowMessage('erreur dans obj.Proc');
        end;
      finally
       obj.Free;
      end;
    end;
    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 traitement;
    begin
      try
        obj : = TObject.Create;
        try
          obj.Proc;
        finally
          obj.Free;
        end;
      except
        ShowMessage('erreur dans le traitement');
      end;
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Gilbert, je ne vois pas bien l'utilité de ton label goto :koi:.
    ça sert à faire du code pas beau
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Bien sûr Paul .

    Mais en l'état, ton premier exemple égale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure traitement;
    begin
      obj := TObject.Create;
     
      try
        obj.Proc;
      except
        ShowMessage('erreur dans obj.Proc');
      end;
     
      obj.Free;
    end;

  9. #9
    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 Andnotor Voir le message
    Bien sûr Paul .

    Mais en l'état, ton premier exemple égale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure traitement;
    begin
      obj := TObject.Create;
     
      try
        obj.Proc;
      except
        ShowMessage('erreur dans obj.Proc');
      end;
     
      obj.Free;
    end;
    là oui, en effet, mais je préfère ajouter un TRY/FINALLY pour le jour ou le code entre les deux pourrait provoquer une exception non monitorée ou un bête Exit
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    label :
    ça sert à faire du code pas beau
    bigre! Vous n'allez quand même pas me dire que ça existe un code "beau".

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-salut,

    label :
    bigre! Vous n'allez quand même pas me dire que ça existe un code "beau".

    A+.
    Ah si, un code peut etre beau ou pas ... Ya des trucs qui rendent un code beau ou pas. Les labels goto c'est pas beau ... les Exits ou Abort c'est pas beau ... Enfin c'est mon point de vue

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Mick605 : En fait s'il fallait définir ce qu'est un code "beau" je dirais qu'il s'agit d'un code qui en en très peu de lignes réalise ce qu'un autre réalise sous forme d'une usine à gaz.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,

    A Mick605 : En fait s'il fallait définir ce qu'est un code "beau" je dirais qu'il s'agit d'un code qui en en très peu de lignes réalise ce qu'un autre réalise sous forme d'une usine à gaz.

    A+.
    Ouais je suis assez d'accord ... mais il y a quand meme des trucs qui rendent le code moins beau et moins facile a comprendre. En plus, avec les labels, on rend le code plus long

    Enfin, c'est mon point de vue !

Discussions similaires

  1. [ADOConnect] gestion des exception en tout temps
    Par portu dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/04/2005, 19h01
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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