2010-08-19 33 views
1

我看到这个代码在这里贴在计算器上:使用嵌套“尝试/终于”“尝试/除”报表

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'中出现错误,将永远不会执行,因为程序将直接跳转到'finally'。对?所以,该函数将返回FALSE。难道我做错了什么?


PS:

  1. 我打算在一个线程中使用此代码。
  2. 我只是把这个函数放在Delphi和编译器有关第一行的抱怨上:“从未使用过的值”。
+0

哪里是在第一个代码的结果的启动?结果=真? – garik 2010-08-19 22:26:36

+0

@igon:我不知道。可能只是演示/骨架代码。 – Ampere 2010-08-19 22:34:24

回答

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; 
1

第一个版本只是吃掉了异常并且从不向上层调用者提出,它将异常视为虚假返回。对于你的简单版本,异常将被抛出。

2

在原来,如果ExecuteTarget抛出异常,它仍然会测试filename的存在。

在你的,如果ExecuteTarget抛出一个异常,结果总是为false。

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

+0

对不起,我在回答我的时候添加了一行代码:DeleteFile(Dest); – Ampere 2010-08-19 22:31:14

+0

“在原来,如果ExecuteTarget抛出一个异常,它仍然会测试文件名存在” - 这是错误的,因为该函数实际上无法从互联网下载NEW文件。对? – Ampere 2010-08-19 22:32:33

+0

@Altar:我不是在评论原始代码的智慧,不知道它做了什么。 – 2010-08-19 22:41:56