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:

  1. I la intención de utilizar este código en un hilo.
  2. Me acaba de poner la función en Delphi y las quejas del compilador sobre la primera línea: "Valor asignado nunca utilizó"
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top