Bonjour,

Je programme depuis une dizaine d'années sous Delphi. J'utilise actuellement la version 2007. Dans le cadre d'une application multitâches je souhaite pouvoir continuer l'exécution d'un thread même si une fonction utilisée provoque une exception (notamment eAccessViolation). Après plusieurs jours de recherches, je ne trouve pas de solution à ce problème sur les différent forums ou tutoriaux que j'ai consulté. J'ai également modifié certains paramètres sur le débugger de Delphi sans succès (Outils/Options/Débuggeur CodeGear).

Afin d'intercepter l'erreur, j'utilise une structure try ... except. Cela fonctionne pour les exceptions de type division par zéro ou autres erreurs mathématiques mais cela ne fonctionne pas pour les exceptions de type eAccessViolation qui se terminent invariablement par l'affichage d'un message sur l'écran.
Premièrement j'aimerais éviter l'affichage de ce message et deuxièment j'aimerais poursuivre l'exécution du programme, la procédure qui provoque l'erreur devant simplement renvoyer une valeur booléenne à TRUE en cas d'erreur eAccessViolation. Est-ce possible ?

Voici un petit programme de test que j'utilise pour tester la capture de l'erreur eAccessViolation. Il y a juste une fiche avec un seul bouton.
Le code qui provoque l'erreur eAccessViolation avec GetMem et Move provient d'un tutorial sur la gestion des exceptions.

Merci pour toute aide que vous pourrez m'apporter.

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
22
23
24
25
26
27
28
29
30
31
32
33
34
// créer une exception de type eAccessViolation
// result = true si une exception s'est produite
function Test_eAccessViolation():boolean;
var
  p1 : pointer;
  p2 : pointer;
begin
 result := false;
 try
  try
   GetMem(p1, 128);
   GetMem(p2, 128);
  // cette ligne provoque une exception eAccessViolation
   Move(p1, p2, 128); 
  finally
   FreeMem(p1, 128);
   FreeMem(p2, 128);
  end;
 except
  result := true;
 end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
 done : boolean;
  p2 : pointer;
begin
 Button1.Caption := 'DEBUT';
 done := Test_eAccessViolation();
 if done = true then ShowMessage('Exception détectée.');
 Button1.Caption := 'FIN';
end;