2010-03-31 6 views
7

Utilizzo Delphi Pro 6 su Windows XP con FastMM 4.92 e JEDI JVCL 3.0. Dato il codice qui sotto, sto avendo il seguente problema: solo il primo blocco di gestione delle eccezioni ottiene un'istanza valida di E. Gli altri blocchi corrispondono correttamente con la classe dell'eccezione che viene sollevata, ma E non è assegnata (nil).Delphi Problema di gestione delle eccezioni con più blocchi di gestione delle eccezioni

Ad esempio, dato l'ordine corrente dei blocchi di gestione delle eccezioni quando sollevo un E1 il blocco per le corrispondenze E1 e E è un'istanza oggetto valida. Tuttavia, se provo a generare un E2, quel blocco corrisponde, ma E non è assegnato (nulla). Se sposto il blocco di cattura E2 in cima all'ordinamento e alzi un E1, quando il blocco E1 corrisponde a E è ora non assegnato. Con questo nuovo ordinamento se sollevo un E2, E viene assegnato correttamente quando non lo era quando il blocco E2 non era il primo blocco nell'ordinamento. Nota Ho provato questo caso con un progetto bare-bones composto da un solo modulo Delphi.

Sto facendo qualcosa di veramente stupido qui o c'è qualcosa di veramente sbagliato?

Grazie, 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

non sono in grado di osservare ogni anomalia in Delphi 2009 utilizzando questo codice –

+0

Penso che questo problema si verifica solo perché in realtà non si utilizza E all'interno del blocco. A causa delle ottimizzazioni del compilatore, questa variabile non sarà stabile quando non è in uso. Se dovessi farlo in qualcosa come OutputDebugString ('E1' + E.Message) dovrebbe funzionare. –

risposta

8

Se ho ragione, il comportamento che state vedendo è assistito nella valutazione e nel debugger (questo ho ottenuto un comportamento simile prove nel debugger BDS 2006).

Questo è un errore di risoluzione dei simboli nel debugger ma non sembra influire sul comportamento di runtime.

Se il comportamento di debug è importante, semplicemente rinominare le variabili gestore eccezione in modo che il debugger non ha (potenziali) ambiguità di dover risolvere:

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

Grazie Deltics. Non lo sapevo. È proprio come la proprietà Stream.size che mi ha portato ad assegnare sempre quella proprietà a una variabile nel codice solo per poter vedere il valore durante il debug poiché il debugger restituisce sempre zero. –