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