El uso de anidado “try / finally” “try / except” declaraciones
-
29-09-2019 - |
Pregunta
He visto el código publicado aquí en StackOverflow:
with TDownloadURL.Create(nil) do
try
URL := 'myurltodownload.com';
filename := 'locationtosaveto';
try
ExecuteTarget(nil);
except
result := false;
end;
if not FileExists(filename) then
result := false;
finally
free;
end;
¿No puede ser simplificado para parecerse a:
Result:= FALSE; <--------- Compiler complains
DeleteFile(Dest);
dl:= TDownloadURL.Create(NIL);
TRY
dl.URL:= URL;
dl.FileName:= Dest;
dl.ExecuteTarget(NIL);
Result:= FileExists(Dest);
FINALLY
dl.Free;
END;
El resultado final: = ... nunca va a ser ejecutado si algo salió mal en 'ExecuteTarget' sea causa el programa saltará directamente a 'fin'. ¿Derecho? Por lo tanto, la función devolverá FALSO. ¿Estoy haciendo algo mal?
PS:
- I la intención de utilizar este código en un hilo.
- Me acaba de poner la función en Delphi y las quejas del compilador sobre la primera línea: "Valor asignado nunca utilizó"
Solución
La diferencia es que el segundo ejemplo pasa excepciones al llamador, mientras que los rendimientos y las atrapa originales falsa. Me caracterizo ese estilo de codificación como "No me importa por qué ha fallado, lo único que importa si tuvo éxito". Que puede ser razonable en algunos casos (como intentar descargar una actualización).
Así que su código es muy diferente de la original de esa manera -. Usted está esperando la llamada al mango excepciones que el código original no lo hace
Además, la queja compilador es porque no hay sucursal en su código -. Si bien las obras y el resultado está determinado por la segunda asignación o si tiene una excepción y el resultado es irrelevante
Result := FALSE; // <--------- Compiler complains
DeleteFile(Dest);
dl := TDownloadURL.Create(nil);
try
dl.URL := URL;
dl.FileName := Dest;
dl.ExecuteTarget(nil);
Result := FileExists(Dest);
finally
dl.Free;
end;
Otros consejos
En el original, si ExecuteTarget lanza una excepción, todavía existe prueba de nombre de archivo.
En el suyo, si ExecuteTarget lanza una excepción, resultado siempre es falsa.
Además, a no ser que se ha saltado una línea, en el original, si ExecuteTarget tiene éxito y el archivo existe, no es nunca result
conjunto.
La primera versión acaba de comer la excepción y no elevar a las personas que llaman superiores, es una excepción tratar como falso retorno. Para su versión simple, a excepción será expulsado.