--Gestion d'erreur au niveau d'une unité--

Utilisateur anonyme - 31 oct. 2003 à 18:24
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008 - 5 nov. 2003 à 01:21
Bonjour.
Dans un de mes programmes, j'utilise une ressource (un TBitmap, pour être précis) dont la portée est celle d'une unité (à laquelle est associée une fiche), c'est à dire qu'elle est déclarée dans
implementation
  var
    BMP :TBitmap;
.

La ressource est initialisée dans la procédure TForm1.FormCreate(); et est libérée dans TForm1.FormClose();.

Comment puis-je mettre en place un code de gestion d'erreur au niveau de l'unité afin de libérer la ressource même si une erreur survient ?

3 réponses

yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
3 nov. 2003 à 23:51
TForm1.FormClose();
begin
freeandnil(bmp);
...
end;

corriger moi si je me trompe ,mais le bitmap est libéré qu'il y ait eu erreur ou non ,ou si on préfère si l'objet à bien été créé ou non .

Pour que l'objet bmp ne soit pas détruit , il faudrait que l'application n'exécute pas OnClose et si c'est le cas ce n'est nullement la faute de cet objet !

enfin , j'ai peut-être pas compris correctement la question !
:blush)
yve
0
Utilisateur anonyme
4 nov. 2003 à 20:42
Vous voulez dire que FormClose(); est exécuté même si une erreur se produit et qu'elle n'est pas explicitement gérée par mon code ?
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
5 nov. 2003 à 01:21
bonjour ,

bon ,ça se précise un peu ,...
on pourrait à la limite insérer des blocs
try imbriqué à chacunes de nos procédures
1- pour tenter de gérer l'erreur

2-l'autre pour fermer l'application
-sauvegarder les données etc...
(limiter les dégats !!!)

var // fiche
numErreur:Integer;

procedure xxx ...
begin
try
try
except
begin
...//tenter de corriger l'erreur
// ici demeure la meilleur solution
// sinon
numErreur:=1; // numéroter les cas ...
// après un événement critique
// dans chaques procédure
end;
end;
finally
begin
testErreur; //
//s'exécutera en cas d'erreur ou non ...

end;
end;
end;

procedure testErreur;
begin
case numErreur of
0:exit;// pas d'erreur
1:exitProcess(10);
2: begin
application.messagebox
('Erreur',
'Une erreur est survenue,
' l''application doit se terminer',
mb_Ok);
exitProcess(10);
application.terminate;
end;

end;
end;

donc si une erreur se produit
-on tente de corriger
-si positif numErreur demeure à 0
et testErreur ne fait rien.

-si négatif on force la termination(1) où
encore à la limite on pourrait avertir
l'utilisateur qu'une erreur s'est produite(2)
et/ou lui indiquer qu'il serait préférable de
redémarrer l'application(3).

une autre idée serait d'utiliser un thread pour
vérifier si l'application tourne normalement ?...
mais y'a pas de code parfait ,
on doit tenter globalement de gerer
au mieux se qui pourrait survenir .

yve
0
Rejoignez-nous