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 :

[Try][Exception] dans toutes les fonctions


Sujet :

Langage Delphi

  1. #1
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut [Try][Exception] dans toutes les fonctions
    Bonjour

    Bonne année 2011 a tous.

    Il y a t'il de gros inconveniant a mettre dans toutes les fonctions et procedures
    d'un programme(petit ou gros), des blocs Try/Except dans un bloc Try/Finally
    genre
    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
     
    Procedure truc;
    Var
      MsgExcept:String;
      ...
    Begin
      MsgExcept := '';
      Try
        Try
           code...
           ....
         Except
          MsgExcept := Exception(ExceptObject).Message;
          Exit;
         End;
      Finally
       ...
       bla bla
       ...
      end
    End;
    Est ce que cela peut beaucoup nuire a la rapidité d'une appli ?

    Mercid 'avance pour vos pistes

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 374
    Points : 3 152
    Points
    3 152
    Par défaut
    Bonjour,

    oui cela affecte les performances de l'application - regarde ce que dit l'aide de D7 :

    Les exceptions offrent un moyen élégant d'intercepter les erreurs d'exécution sans arrêter le programme et sans utiliser d'encombrantes instructions conditionnelles. Les exigences imposées par la sémantique de la gestion des exceptions se traduisent par une pénalisation au niveau de la taille du code ou des données et au niveau des performances à l'exécution. Il est possible de déclencher des exceptions pour presque toutes les raisons et de protéger pratiquement n'importe quel bloc de code en l'intégrant dans une instruction try...except ou try...finally, mais, en pratique, il vaut mieux réserver ces outils à des situations particulières.

    La gestion des exceptions convient aux erreurs qui ont peu de chances de se produire, mais dont les conséquences sont quasiment catastrophiques (le crash d'une application, par exemple) ; aux conditions d'erreurs difficiles à tester dans des instructions if...then ; et quand vous avez besoin de répondre aux exceptions déclenchées par le système d'exploitation ou par des routines dont le code source n'est pas sous votre contrôle. Les exceptions sont couramment utilisées pour les erreurs matérielles, de mémoire, d'entrée/sortie et du système d'exploitation.
    Bonne année 2011

    Charly

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    S'il n'y a pas d'ittération, le problème de temps est négligeable

    Par contre dans le code tel que présenté, l'utilité du bloc try..finally est discutable. Sans parler du Exit inutile !

  4. #4
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    Merci a vous 2

    @Charly910
    Je savais que j'avais lut un truc du genre, mais je savais plus où.

    @Andnotor
    C'est bon a savoir : si peu d'iterat°, pas de risque de lenteur sensible.
    En fait, j'instancie souvent des objets, avant le premier Try, d'ou le finally qui doit les detruire.
    pour le "Exit" dans l'Except, tu as raison, tel que c'est il est inutil.

    Au plaisir

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    A moins d'un Raise dans l'except et l'exception ayant déjà été gérée, il n'y a plus aucun risque. Finally est donc inutile

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    A moins d'un Raise dans l'except et l'exception ayant déjà été gérée, il n'y a plus aucun risque. Finally est donc inutile
    Ca depend le reste du code, dans le cas de libération d'objet ca arrive souvent de faire cela

    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
     
    var
      lst : TStringList;
    begin
      lst := TStringList.Create;
      try
        Try
        Except on e:Exception do
           // Gestion de l'erreur
           raise;
        end;
      finally
        lst.Free;
      end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    Je mentionnais le Raise et cela dépend bien sûr du code total.
    Mais j'aime avoir du code le plus concis possible et si l'état peut être considérer comme stable, finally devient inutile même en cas de destruction d'objet

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je mentionnais le Raise et cela dépend bien sûr du code total.
    Mais j'aime avoir du code le plus concis possible et si l'état peut être considérer comme stable, finally devient inutile même en cas de destruction d'objet
    Je ne suis pas d'accord, pour au moins deux raisons :

    • Tu peux avoir une erreur non prévue (pas gérée dans le except) - savais-tu à ce propos que Exception n'est pas la classe de base de toutes les exceptions ? Il s'agit de TObject, en fait.
    • Le code dans le except pourrait lui-même lever une exception.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    Je ne dis pas qu'elle doit être systématiquement ignorée, mais que cette 2ème protection est inutile si l'état est stable après l'except. Bien sûr que si ce n'est pas le cas ou qu'on a un doute, autant la laisser

    J'admets faire assez peu de test sur un type d'exception précise. En règle générale, c'est un appel qui pose problème et qui doit être sécurisé. Dans mon cas, on E:Exception do me suffit pour récupérer et afficher le message (si besoin). A mon sens, s'il faut tester N exceptions, c'est que le bloc est trop gros ou qu'il manque un ou deux if bien placés. (Mais ça ne regarde que moi )

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    A mon sens, s'il faut tester N exceptions, c'est que le bloc est trop gros ou qu'il manque un ou deux if bien placés. (Mais ça ne regarde que moi )
    Et à mon sens, un "on Error: Exception do" est une des pires choses que je puisse voir dans un code. Parce que pour moi ça veut dire : je ne sais pas ce que je fais, donc je catche tout comme ça je n'aurai pas de problème

    Visiblement, nous avons deux manières totalement différentes d'appréhender la gestion d'erreur

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    Citation Envoyé par sjrd Voir le message
    ...Parce que pour moi ça veut dire : je ne sais pas ce que je fais, donc je catche tout comme ça je n'aurai pas de problème
    Pour moi, c'est justement le contraire
    Ce serait le cas si on englobait les N lignes de la procédure dans le bloc try except sans aucune réflexion. Peu importe le code et la validité des données, tout cela sera géré (on fera le tri tant bien que mal) plus tard par l'exception.

    Je préfère et de loin me dire que telle ou telle fonction peut entraîner un problème et le gérer immédiatement plutôt que d'attendre la fin et me dire : est-ce que...est-ce que...

    Prenons un cas simple : StrToInt. Je pourrais tester EConvertError. Mais en sachant que l'erreur de conversion est la seule erreur possible, à quoi bon en déterminer le type exact. Et même si un autre type d'exception existait (sur le signe par exemple), la donnée reste invalide et c'est la seule chose qui m'intéresse. Remplaçons-la par une valeur par défaut ou avertissons immédiatement l'utilisateur de son erreur. Inutile de faire d'autres tests

    Il s'agit simplement de savoir où on place la logique. Tu préfères centraliser la gestion des exceptions, je préfère ne pas la laisser se propager plus loin que l'appel incriminé. Quelle est la meilleur solution ? C'est certainement bonnet blanc et blanc bonnet

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    Pour ma part, je trouve que l'utilisation du "finally" et du "if (Assigned())" sont essentielles pour détruire les objets qui ne doivent plus être utilisé.
    Supposons qu'on déclare un Objet A dans une procédure QuelqueChose et qu'un autre développeur pour une raison X ou Y décide d'appeler une procédure quelconque dans laquelle, il utilisé A et le détruit on se retrouve avec une grosse violation d'accès par la suite.

    Je toujours essayé de faire en sorte que la procédure qui déclare un objet soit également être responsable de sa libération mais ne vivant pas dans le monde des bisounours, il y a toujours un autre développeur qui risque de mettre un gros bordel au milieu de mon code !

    Prenons un cas simple : StrToInt. Je pourrais tester EConvertError. Mais en sachant que l'erreur de conversion est la seule erreur possible, à quoi bon en déterminer le type exact. Et même si un autre type d'exception existait (sur le signe par exemple), la donnée reste invalide et c'est la seule chose qui m'intéresse. Remplaçons-la par une valeur par défaut ou avertissons immédiatement l'utilisateur de son erreur. Inutile de faire d'autres tests
    Ne serait-il pas préférable de vérifier ça avant que l'utilisateur valide sa saisie !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    Tu auras beau avoir placé toutes les destructions dans finally. Si l'objet n'existe déjà plus, c'est là que sera généré l'AV et ça ne résoudra pas le problème

    If Assigned(), oui pour autant que le pointer ait été reseté (nil). Ce qui implique aussi que la procédure "Quelconque" reçoive le pointeur en paramètre var.

    Ne serait-il pas préférable de vérifier ça avant que l'utilisateur valide sa saisie !
    Si saisie manuelle il y a, bien sûr. Mais il faut également penser à l'ouverture de fichier, etc. (StrToInt n'était qu'un exemple)

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Perso, je me suis fait une fonction RealAssigned qui vérifie qu'un objet existe (vérification de ClassName, ClassType, IsBadReadPtr)

    J'en ai eu besoin durant les sections finalization, j'ai eu quelques soucis d'objet partagés par plusieurs listes ou libérés (sans avoir fait de notification)
    En corrigeant, certaines maladresses normalement, plus besoin de bidouiller !
    Faudrait que je trouve, j'avais encore un cas où je l'utilisais !

    je suis aussi adepte du try finally, mais je suis totalement contre l'exemple de Teo, une exception doit être gérée
    Gérer une exception, c'est déjà un code correctif genre RollBack
    Un éventuel log pour les programmes Batch, Service, ...
    Un éventuel redéclenchement, parfois je requalifie l'exception, genre j'ai eu une ESOAPHTTPException, je vais redéclencher EMonWebServiceAMoiError pour savoir quel objet a planter !
    Sinon il faut la laisser remonter, elle sera peut-être gérée plus loin !

    Je suis comme SJRD, il faut SAVOIR ce que son code fait !

    J'ai quelques fonctions genre celle de Log (dans un fichier), dans celle ci, j'ignore les exceptions (un petit OutputDebugString quand même), dans certains cas, on peut fermer les yeux !

    En général, les exceptions sont assez rare à part celle de la DB (une bonne encapsulation de la gestion DB et cela ne pose pas de problème), quelques erreurs SOAP et quelques exceptions étranges de Indy genre ESuccessfullException c'est tout de même rare !


    Lorsque a un "un autre développeur" qui libère a tord des objets, tu trouves la tasse a café la plus proche et tu lui balances dessus !

    Sinon pour StrToInt autant utilise TryStrToInt qui permet de gérer les erreurs sans passer par des exceptions (plus rapide) ou StrToIntDef très pratique aussi

  15. #15
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Eh bien... Je pense que tout ceci mériterait un véritable tutoriel. Il va falloir que je fasse un truc comme ça quand j'aurai le temps

    En voilà un (blog) qui, selon moi, ne dit pas bêtises (mais ne dit pas grand chose non plus, il manque plein de trucs) :
    http://www.juliencarnelos.com/2006/0...es-exceptions/

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 761
    Points : 13 368
    Points
    13 368
    Par défaut
    Le point 1 me plaît bien.
    Le point 2 a peu d' (aucun) intérêt. C'est de la logique.
    Le point 3 est un point 2 mal réfléchi. Les deux phrases suivantes sont carrément choquantes:

    quand une exception incontrôlée survient dans le but d’assainir le programme
    et
    sur le moment effectivement si une erreur survient le client est content car son application n’affiche pas d’erreur et il peut continuer en apparence.
    Assainir le programme lorsqu'il est déjà chez le client. Well... quel manque de rigueur ! De plus,si elle est incontrôlée, comment en déterminer le type exact ? Le point 3 est le point 2 sans aucune reflexion.

    Si tu as compris ce sens en mes propos, c'est que je me suis vraiment mal exprimé
    Mon approche est très booléenne. Je peux remédier au problème en remplaçant la donnée par une valeur par défaut (point 1) ou l'exécution est interrompue (point 2). Il n'est aucunement question de laisser l'exécution se poursuivre avec une donnée incohérente. C'est la seule chose qui soit vraiment très mal

Discussions similaires

  1. [Débutant] paramètrer le nom du modèle dans toutes les fonctions
    Par nawal59 dans le forum Interfaces Graphiques
    Réponses: 23
    Dernier message: 21/10/2010, 12h09
  2. Comment MAJ le même champ présent dans toutes les tables ?
    Par PamelaGeek dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/02/2006, 14h06
  3. Comment s'y retrouver, parmis toute les fonctions ?
    Par AsmCode dans le forum OpenGL
    Réponses: 32
    Dernier message: 25/10/2005, 10h26
  4. Réponses: 3
    Dernier message: 08/08/2004, 21h35
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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