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 :

comment traquer une 'erreur abstraite' ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 32
    Points : 25
    Points
    25
    Par défaut comment traquer une 'erreur abstraite' ?
    Bonjour,

    dans certains cas (reproductibles) l'application que je développe
    me lance une exception de type 'erreur abstraite'.
    Le problème est que lorsque que j'arrête l'application avec l'IDE,
    le point d'arrêt est dans les choux, je ne trouve pas l'origine
    du problème.

    Comment faire pour déloger l'origine de cette exception ?

    Merci.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Tu ne l'attraperas pas en débuggant car une erreur abstraite vient du fait que tu as certainement instancié une classe dont l'une de ses méthodes porte la directive "virtual; abstract;" et de plus tu tentes d'appeler cette méthode dans ton code.

    Tu ne peux pas utiliser cette classe directement, tu dois la dériver et surcharger la ou les méthodes marquées avec les directives "abstract".

    Par exemple la classe TStrings est une classe abstraite, on ne l'instancie jamais directement, en revanche si tu peux utiliser TStringList qui dérive de Tstrings.

    Donc dis nous quelles classes tu instancies dans ton code et on pourra t'aider à retrouver la classe abstraite qui provoque ton erreur.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    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
    Salut

    As-tu une idée de quelle classe (classe de base ou une de ses dérivées) provient l'erreur, si elle provient d'une classe spécifique à ton application, vérifies que toutes les méthodes abstraites sont bien surchargées dans les classes concrètes que tu utilises.

    Si tu soupçonnes une méthode particulière et que tu peux modifier le source de la classe de base, rend temporairement cette méthode concrète et envoie un message du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //procedure Toto; virtual; abstract;
    procedure Toto; virtual;
    ...
    procedure TMaClasseAbstraite.Toto;
    begin
      ShowMessage('bouh! '+self.className);
    end;
    qui doit te révéler le nom de la coupable. A éliminer après coup.
    C'est de la bidouille, mais bon..

    @+

    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."

  4. #4
    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
    tu peux trouver l'erreur grâce aux commentaires !

    non, je plaisante...par contre si tu fais un Build de ton projet Delphi devrait te mettre un WARNING sur l'instanciation d'une classe possédant des méthodes abstraites.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    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
    tout dépend de la façon dont la dite classe est instanciée, exemple si l'on part d'une référence de classe dans un tableau, ça peut devenir compliqué pour le compilo.

    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."

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Pascal Jankowski Voir le message

    Donc dis nous quelles classes tu instancies dans ton code et on pourra t'aider à retrouver la classe abstraite qui provoque ton erreur.
    Bonjour,

    En fait, mon code n'utilise pas de classe abstraite.
    A près réflexion, je pense que c'est un bug par ailleurs qui provoque
    cette exception ( genre un écrasement de mémoire ).
    Dans d'autre cas, j'ai un message comme quoi l'enregistrement a été modifié
    par un autre utilisateur (j'utilise pas mal de TQuery créées dynamiquement).

    Donc je vais examiner plus attentivement mon code pour pour savoir
    ce qui cloche...

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    fait des try catch sur EAbstractError, tu pourras cerner petit à petit l'endroit de l'exception plus facilement qu'avec le notificateur d'exception

    Cela peut venir d'un simple TStrings comme le souligne Pascal Jankowski
    Pense qu'un TQuery c'est justement l'implémentation d'un tas de méthodes abstraites d'un TDataSet

    Surveille aussi, le warning mentionné par Paul TOTH :
    x1020: Construction d'instance de '%s' contenant des méthodes abstraites '%s.%s' (Delphi)
    E2402 Construction de l'instance de la classe abstraite '%s' (Delphi)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    fait des try catch sur EAbstractError, tu pourras cerner petit à petit l'endroit de l'exception plus facilement qu'avec le notificateur d'exception

    Cela peut venir d'un simple TStrings comme le souligne Pascal Jankowski
    Pense qu'un TQuery c'est justement l'implémentation d'un tas de méthodes abstraites d'un TDataSet
    Bonjour,

    j'ai fini par trouver la cause du problème.
    Pour faire simple : un traitement dans un événement appartenant à objet provoquait la destruction de celui-ci.

    Evidemment, dans le code ça ne tombait sous le sens à la première lecture :-)

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

Discussions similaires

  1. [Oracle 10g] Comment résoudre une erreur ORA-3000
    Par DoRiane dans le forum Oracle
    Réponses: 3
    Dernier message: 10/04/2006, 09h44
  2. comment intercepté une erreur
    Par Guillau.laurent dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/03/2006, 09h28
  3. Comment détecter une erreur dans un process
    Par chuckboy dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2005, 10h40
  4. Réponses: 18
    Dernier message: 19/10/2005, 14h07
  5. Comment lancer une erreur dans une procédure stockée
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/05/2005, 17h06

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