如何使用TDownLoadURL处理下载失败或无效的URL链接或Internet故障等异常?

时间:2016-10-19 10:33:31

标签: delphi vcl

我有一个包含用于下载应用程序的对象TDownloadUrl(VCL.ExtActns)的VCL应用程序,我的问题是如何处理任何限制下载的异常[例如: - 如下载失败或无效的URL链接或互联网使用TDownLoadURL?失败或网址无法访问或互联网不可用?

提前致谢

2 个答案:

答案 0 :(得分:0)

TDownloadURL只定义了2条错误消息,这些消息都在Vcl.Consts单元中声明:

  • SUrlMonDllMissing,在运行时无法访问Win32 URLDownloadToFile()函数时引发。

  • SErrorDownloadingURL,当URLDownloadToFile()因任何原因失败时引发。遗憾的是,无法区分 URLDownloadToFile()失败的原因(尽管OnProgress事件可能会在失败发生之前提供有关它正在执行的操作的信息。)

错误消息是资源字符串,因此可以进行本地化,因此它们可能使用任何语言,而不仅仅是英语。它们是使用通用SysUtils.Exception类本身而不是任何派生类型引发的。但是,您可以将它们用于子字符串匹配,至少:

uses
  ..., Vcl.ExtActns, Vcl.Consts, System.StrUtils;

try
  DownloadURL1.Filename := ...;
  DownloadURL1.URL := ...;
  DownloadURL1.Execute;
except
  on E: Exception do
  begin
    if StartsText(SUrlMonDllMissing, E.Message) then
      ...
    else if StartsText(SErrorDownloadingURL, E.Message) then
      ...
    else
      ...
  end;
end;

如果您需要更详细的错误信息,可以尝试直接调用URLDownloadToFile(),因为它会返回HRESULT值。然而, 请注意文档中的以下问题:

  

即使无法创建文件且取消下载,URLDownloadToFile也会返回S_OK。如果szFileName参数包含文件路径,请在调用URLDownloadToFile之前确保目标目录存在。为了最好地控制下载及其进度,建议使用IBindStatusCallback接口。

如果这不能解决您的问题,那么您应该使用不同的HTTP客户端API /库来执行下载,例如Indy,ICS,Synapse,WinInet / WinHTTP,libCURL等中的HTTP客户端。

答案 1 :(得分:-1)

我没有使用过此组件,但它可能会根据遇到的错误生成不同的异常类型。如果是这种情况,那么这里的文章将介绍如何处理多种异常类型:

Delphi Exception handling problem with multiple Exception handling blocks