2010-03-31 16 views
7

J'utilise Delphi Pro 6 sous Windows XP avec FastMM 4.92 et JEDI JVCL 3.0. Étant donné le code ci-dessous, j'ai le problème suivant: seul le premier bloc de gestion d'exception obtient une instance valide de E. Les autres blocs correspondent correctement à la classe de l'exception étant levée, mais E est non affecté. Par exemple, étant donné l'ordre actuel des blocs de gestion des exceptions lorsque je lève un E1, le bloc pour E1 correspond et E est une instance d'objet valide. Cependant, si j'essaie d'élever un E2, ce bloc correspond, mais E n'est pas affecté (nul). Si je déplace le bloc d'accrochage E2 en haut de la commande et soulève un E1, alors quand le bloc E1 correspond à E, il est maintenant non affecté. Avec cette nouvelle commande si j'élève un E2, E est correctement affecté alors que ce n'était pas le cas lorsque le bloc E2 n'était pas le premier bloc de la commande. Note J'ai essayé ce cas avec un projet de bare-bones composé d'un seul formulaire Delphi. Est-ce que je fais quelque chose de vraiment stupide ici ou est-ce que quelque chose ne va vraiment pas?Delphi Problème de gestion des exceptions avec plusieurs blocs de gestion des exceptions

Merci, Robert

type 
    E1 = class(EAbort) 
    end; 

    E2 = class(EAbort) 
    end; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    try 
     raise E1.Create('hello'); 
    except 
     On E: E1 do 
     begin 
      OutputDebugString('E1'); 
     end; 

     On E: E2 do 
     begin 
      OutputDebugString('E2'); 
     end; 

     On E: Exception do 
     begin 
      OutputDebugString('E(all)'); 
     end; 
    end; // try() 
end; 
+0

Je suis incapable d'observer toute anomalie dans Delphi 2009 en utilisant ce code. –

+0

Je pense que ce problème ne se produit que parce que vous n'utilisez pas réellement E dans le bloc. En raison des optimisations du compilateur, cette variable ne sera pas stable lorsqu'elle n'est pas utilisée. Si vous voulez mais dans quelque chose comme OutputDebugString ('E1' + E.Message) cela devrait fonctionner. –

Répondre

8

Si je ne me trompe pas, le comportement que vous voyez est été témoin lors de l'évaluation E sous le débogueur (ce que j'obtenu ce comportement similaire test dans le débogueur BDS 2006).

Il s'agit d'un bogue de résolution de symbole dans le débogueur mais qui ne semble pas affecter le comportement d'exécution.

Si le comportement de débogage est important, il suffit de renommer vos variables de gestionnaire d'exceptions pour que le débogueur n'a pas d'ambiguïtés (potentielles) d'avoir à résoudre:

On E1: E1 do 
begin 
    OutputDebugString('E1'); 
end; 

On E2: E2 do 
begin 
    OutputDebugString('E2'); 
end; 

On Ex: Exception do 
begin 
    OutputDebugString('E(all)'); 
end; 
+0

Merci Deltics. Je ne savais pas à propos de celui-là. C'est comme la propriété Stream.size qui m'a conduit à toujours assigner cette propriété à une variable dans le code juste pour que je puisse voir la valeur pendant le débogage puisque le débogueur renvoie toujours zéro. –