Fonction appelante

Fonction appelante - Delphi/Pascal - Programmation

Marsh Posté le 23-05-2003 à 11:57:52    

Bon c encore moi, vous allez me trouver pénible à tout le temps poser des questions, mais promis je fais des recherches avant, que ce soit dans la doc papier ou dans l'aide en ligne mais impossible de trouver ce que je veux (enfin j'en trouve mais dans ce cas je pose pas de questions donc vous vous en rendez pas compte !). Et google, j'ai pas vraiment Internet (quand je poste, je suis obligé de changer de pièce, de débrancher un fax, de me connecter en 56k... Bref c pas le top !) donc difficile de l'utiliser !
 
Cette fois-ci je gère les erreurs lors de l'appel de fonctions. J'ai créé une fonction qui permet d'afficher un message d'erreur (ct mieux ainsi, étant donné qu'elle est potentiellement appelée très souvent). Pour l'instant j'affiche le code de l'erreur mais j'aimerai également afficher le nom de la fonction qui l'a appelée.
Je m'explique :

Code :
  1. procedure erreur_appel(code_erreur:integer) ;
  2. begin
  3.   messagedlg('Erreur lors de l''appel d''une fonction'+chr(13)+chr(10)+chr(13)+chr(10)+
  4.     'Code erreur : '+IntToStr(code_erreur),mtError,[mbOK],0);
  5. end;
  6. function mafonc(...):integer ;
  7. begin
  8.   retour_:=Autre_fct(param);
  9.   if retour=0 then
  10.   begin
  11.     // C tt bon, je fais mon tralala
  12.     mafonc:=1;
  13.   end
  14.   else
  15.   begin 
  16.     erreur_appel(retour);
  17.     mafonc:=0;
  18.   end;
  19. end;


Donc ça ça fonctionne, mais ce que j'aimerai pouvoir faire c également affiché le nom de la fonction où a eu l'erreur, genre ici "mafonc". Je peux bien sur le faire en rajoutant un paramètre "nom_fonction: string" mais ça m'oblige à chaque appel à l'écrire en dur... D'où ma question (on y arrive !), est-ce qu'il y a un moyen de connaitre le nom de la focntion appelante automatiquement ? Bref ct long mais la réponse tient en un mot !
 
Puisque j'y suis, c pas possible de faire affectation et test sur la même ligne, dans le genre : if (retour_SIS:=SIS_AjouterGroupe(1130))=0 (ça ça marche pas, c pour ça que je demande !)
Puisque j'y suis deuxième, y'a pas mieux que le chr(13)+chr(10) pour passer à la ligne ?!
Merci pour tout !

Reply

Marsh Posté le 23-05-2003 à 11:57:52   

Reply

Marsh Posté le 23-05-2003 à 12:05:31    

alors,
- à ma connaissance, il n'y a pas moyen de récupérer le nom de la fonction appelante
- pour l'affectation+comparaison comme en C & PHP, je ne pense pas que ça fonctionne
- tu peux utiliser #13#10 (sans + entre les deux, juste des plus des deux côtés pour le concaténer aux chaînes avant et après), c'est plus court que chr(13)+chr(10). Ou aussi la constante sLineBreak qui a l'avantage de te renvoyer juste #10 si jamais tu es sous Linux (pour faire du code portable donc)
 
Pour ton  
'Erreur lors de l''appel d''une fonction'+chr(13)+chr(10)+chr(13)+chr(10)+
  'Code erreur : '+IntToStr(code_erreur)
 
je ferais :
Format('Erreur lors de l''appel d''une fonction%0:s%0:sCode erreur : %d', [sLineBreak, code_erreur]);


Message édité par antp le 23-05-2003 à 12:05:45

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 23-05-2003 à 12:05:50    


1. Avoir le nom?
Oui et non, tu peux en ayant la table des symboles (un bon gros fichier debug) et en reprennant l'adresse sur le stack pour voir qui a apellé la fonction mais ca te fera bcp bcp bcp plus de code que defiler le nom de la fonction ;)
 
Par contre tu ferais mieux de regarder du côté des Assert() et raise Exception.Create, mais probablement que l'Assert te sera plus utile.
 
2. Retour à la ligne?
sLineBreak
 


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 23-05-2003 à 12:30:20    

Merci bien à tous les 2
Après mures réflexions, je vais pas étudier la table des symboles machin tt ça et je vais rajouter un petit string... :)
Effetcivement antp, ton Format('Erreur lors de l''appel d''une fonction%0:s%0:sCode erreur : %d', [sLineBreak, code_erreur]); est quand même plus joli que ce que j'avais mis !

Reply

Marsh Posté le 23-05-2003 à 12:39:25    

Je me mouille peut-etre un peu mais est-ce qu'un
 

Code :
  1. try
  2.   Autre_fct(param);
  3.   // si ca passe, continuer a executer
  4.   mafonc:=1;
  5. except
  6.   on <type d'erreur> do <traitement>;
  7.   mafonc:=0;
  8. end;


 
ne serait pas plus efficace ?


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 23-05-2003 à 12:46:37    

bah c'est une gestion d'erreur avec exceptions plutôt que codes d'erreurs, je sais pas si l'un est plus efficace que l'autre (et ça dépend ce qu'on entend par efficace :D)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed