2010-03-31 26 views
7

Estoy usando Delphi Pro 6 en Windows XP con FastMM 4.92 y JEDI JVCL 3.0. Dado el siguiente código, tengo el siguiente problema: solo el primer bloque de manejo de excepciones obtiene una instancia válida de E. Los otros bloques coinciden adecuadamente con la clase de la excepción que se está generando, pero E no está asignada (nil).Delphi Problema de manejo de excepciones con múltiples bloques de manejo de excepciones

Por ejemplo, dado el orden actual de los bloques de manejo de excepciones cuando elevo un E1, el bloque para E1 coincide y E es una instancia de objeto válida. Sin embargo, si trato de subir un E2, ese bloque no coincide, pero E no está asignado (nada). Si muevo el bloque de captura E2 a la parte superior de la ordenación y levanto un E1, entonces cuando el bloque E1 coincide con E está ahora sin asignar. Con este nuevo orden si elevo un E2, E se asigna correctamente cuando no era cuando el bloque E2 no era el primer bloque en el orden. Tenga en cuenta que probé este caso con un proyecto escueto que consiste en una sola forma Delphi.

¿Estoy haciendo algo realmente tonto aquí o es algo realmente malo?

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

Soy incapaz de observar cualquier anomalía en Delphi 2009 usando este código –

+0

Creo que este problema solo ocurre porque en realidad no usa E dentro del bloque. Debido a las optimizaciones del compilador, esta variable no será estable cuando no esté en uso. Si lo hiciera pero en algo como OutputDebugString ('E1' + E.Message) debería funcionar. –

Respuesta

8

Si estoy en lo cierto, el comportamiento que está viendo es testigo en la evaluación de E en el depurador (esto obtuvo un comportamiento similar probar esto en el depurador BDS 2006).

Este es un error de resolución de símbolo en el depurador, pero no parece afectar el comportamiento del tiempo de ejecución.

Si el comportamiento de depuración es importante, sólo tiene que cambiar el nombre de las variables de gestión de excepciones para que el depurador no tiene ningún ambigüedades (potenciales) a tener que resolver:

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

Gracias Deltics. No sabía sobre eso. Es exactamente como la propiedad Stream.size que me llevó a asignar siempre esa propiedad a una variable en el código solo para poder ver el valor durante la depuración ya que el depurador siempre devuelve cero. –