1

我在 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;

不能简化成如下所示:

 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;

如果“ExecuteTarget”出现问题,最终的 Result:= ... 将永远不会执行,因为程序将直接跳转到“finally”。对?因此,该函数将返回 FALSE。难道我做错了什么?


PS:

  1. 我打算在线程中使用此代码。
  2. 我只是把函数放在 Delphi 中,编译器抱怨第一行:“赋值从未使用过”。
4

3 回答 3

12

不同之处在于您的第二个示例将异常传递回调用者,而原始示例将它们捕获并返回 false。我将这种编码风格描述为“我不关心它为什么失败,我只关心它是否成功”。在某些情况下这可能是合理的(例如尝试下载更新)。

因此,您的代码与原始代码有很大不同 - 您期望调用者处理原始代码没有的异常。

此外,编译器抱怨是因为您的代码中没有分支 - 如果工作和结果由第二次分配确定,或者您有异常并且 Result 无关紧要。

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;
于 2010-08-20T02:04:09.500 回答
2

在原来的情况下,如果 ExecuteTarget 抛出异常,它仍然会测试文件名是否存在。

在您的情况下,如果 ExecuteTarget 引发异常,则结果始终为 false。

此外,除非您跳过一行,否则在原始文件中,如果 ExecuteTarget 成功并且文件存在,result则永远不会设置。

于 2010-08-19T22:24:12.737 回答
1

第一个版本只是吃异常,从不向上层调用者提出,它将异常视为错误返回。对于您的简单版本,将抛出异常。

于 2010-08-19T22:23:36.187 回答