2012-09-16 14 views
5

¿Hay alguna diferencia práctica entre los dos patrones de codificación en Delphi:¿Cuál es la diferencia entre envolver un bloque try-finally con un bloque try-except y viceversa?

Versión 1

try 
    try 
    {Do something} 
    finally 
    {Do tidy up} 
    end 
except 
    {Handle exception} 
end; 

Versión 2

try 
    try 
    {Do something} 
    except 
    {Handle exception} 
    end 
finally 
    {Do tidy up} 
end; 
+5

Como un lado, encontré un error bastante extravagante x64 relacionado con bloques finalmente que significa que pueden ser llamados dos veces! http://qc.embarcadero.com/wc/qcmain.aspx?d=108457 –

+0

El código no muestra dónde se asigna un recurso protegido (SomeObject.Create). ¿Está en la parte 'hacer algo' o antes? – mjn

+0

Es desafortunado que los bloques 'finally' y' except' sean ambos introducidos con la misma palabra clave 'try' porque de lo contrario son conceptos ortogonales. –

Respuesta

6

hay dos diferencias:

  1. El orden relativo en que se ejecutan los bloques except y finally difiere. En la versión 1, finalmente se ejecuta antes que el excepto. En la versión 2, el orden de ejecución se invierte.
  2. En la versión 1, si el bloque finally aumenta, entonces será manejado por el bloque except. En la versión 2, si el bloque finally aumenta, entonces será manejado por el siguiente controlador de excepción que contiene, es decir, fuera de este código.

Por lo general, no le preocupan los bloques que finalmente se levantan. Simplemente no esperas que eso suceda y, si lo hace, es probable que algo esté muy roto.

Así que la diferencia que cuenta es si finalmente se ejecuta antes que el manejador de excepciones, o viceversa. A veces no importa, pero a menudo hace la diferencia.

2

Cuando usa try..except debajo de las líneas ejecutadas.

Resource := TAbstractResource.Create; 
try 
    Resource.DoSomeThing; 
except 
    On E:Exception Do 
    HandleException(E); 
end; 
FreeAndNil(Resource); 
+0

No puedo ver cómo esto se relaciona con la pregunta, o incluso con cualquier cosa. Además, la mejor práctica es usar finalmente para proteger los recursos y dejar que las excepciones floten a un código de nivel superior. –

+1

Creo que el que responde quiere decir que si manejas cualquier excepción en el bloque 'except' no necesitas bloquear' finally'. – kludg

+0

@Serg OK, eso tendría sentido. Sin embargo, todavía rechazaría este código si alguna vez se me presentara. Try/finally es cómo proteger los recursos y cuando veo try/finally, sé lo que significa. Cuando no lo veo, tengo que pensar. –

Cuestiones relacionadas