indy10中的idftp组件异常处理的问题

coolspac 2008-09-30 12:43:27
我调用connect方法后,出现异常,异常可能是dns解析错误,或者服务器连接错误等,那我怎么才能获得具体是什么类型的错误异常呢?

例如:
try
FTP.Connect;
except
case ()of
//Application.MessageBox('adf','adf',MB_OK);
end;


这里的case of怎么写才会将不同才异常取出呢?
例如如果是dns解析失败,则提示dns解析错误,服务器连接错误就提示服务器未开启等等

请教
...全文
299 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolspac 2008-09-30
  • 打赏
  • 举报
回复
知道怎么用了,谢谢各位
僵哥 2008-09-30
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
begin
try
IdFTP1.Connect;
except
On E:Exception do begin
if E is EIdSocketError then begin
case EIdSocketError(E).LastError of
WSANOTINITIALISED: ShowMessage('未应用程序没有调用 WSAStartup,或者 WSAStartup 失败,或者在此之前调用了 WSACleanup。');
WSAENETDOWN: ShowMessage('套接字操作遇到了一个已死的网络。网络子系统已经失效.');
WSAEADDRINUSE: ShowMessage('端口被占用,通常每个套接字地址(协议/网络地址/端口)只允许使用一次。');
WSAEINTR: ShowMessage('一个封锁(阻塞)操作被使用 WSACancelBlockingCall 的调用中断。');
WSAEINPROGRESS: ShowMessage('目前正在执行一个阻塞性操作。');
WSAEALREADY:ShowMessage('在一个非阻塞性套接字上尝试了一个已经在进行的操作。 ');
WSAEADDRNOTAVAIL:ShowMessage('请求的地址无效。');
WSAEAFNOSUPPORT: ShowMessage('使用了与请求的协议不兼容的地址。');
WSAECONNREFUSED: ShowMessage('连接被远程主机拒绝');
WSAEFAULT: ShowMessage('系统检测到在一个调用中尝试使用指针参数时的无效指针地址。');
WSAEINVAL: ShowMessage('提供了一个无效的参数。连接所使用的套接字描述符可能正在监听中。');
WSAEISCONN: ShowMessage('在一个已经连接的套接字上做了一个连接请求。');
WSAENETUNREACH: ShowMessage('向一个无法连接的网络尝试了一个套接字操作');
WSAEHOSTUNREACH: ShowMessage('套接字操作尝试一个无法连接的主机。');
WSAENOBUFS: ShowMessage('由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。');
WSAENOTSOCK: ShowMessage('在一个非套接字上尝试了一个操作。套接字描述符(Socket)无效');
WSAETIMEDOUT: ShowMessage('由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。');
WSAEWOULDBLOCK:ShowMessage('无法立即完成一个非阻止性套接字操作。在非阻塞操作当中,通常此错误表示操作成功。');
WSAEACCES: ShowMessage('以一种访问权限不允许的方式做了一个访问套接字的尝试。');
end;
end;
end;
end;

end;
ideation_shang 2008-09-30
  • 打赏
  • 举报
回复
僵哥说的不错,GetLastError已经不能获取正确的错误值,不过可以用IdException来获取,uses IDException;
try
FTP.Connect;
except
on E:EIdSocketError do
begin
case E.LastError of
9001:ShowMessage('DNS 服务器无法解释格式');
9002:ShowMessage('DNS 服务器失败');
10060:ShowMessage('由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败');
10061:ShowMessage('不能做任何连接,因为目标机器积极地拒绝它');
end;
end;
end;
coolspac 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 unsigned 的回复:]
To 6,7楼,在IdFTP内部使用了Exception机制抛出异常,此时OS Last Error已经被改写为0,在except当中已无法使用GetLastError取得具体的错误号.
[/Quote]

getlasterror我试过了,的确不行,那么这时怎么才能取得正确的错误号呢?难道要对错误message进行比较?
僵哥 2008-09-30
  • 打赏
  • 举报
回复
To 6,7楼,在IdFTP内部使用了Exception机制抛出异常,此时OS Last Error已经被改写为0,在except当中已无法使用GetLastError取得具体的错误号.
五维思考 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ideation_shang 的回复:]
Delphi(Pascal) code
try
FTP.Connect;
except
case GetLastError of
9001:ShowMessage('DNS 服务器无法解释格式');
9002:ShowMessage('DNS 服务器失败');
10060:ShowMessage('由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败');
10061:ShowMessage('能做任何连接,因为目标机器积极地拒绝它');
...
end;
end;
[/Quote]

YES
ideation_shang 2008-09-30
  • 打赏
  • 举报
回复

try
FTP.Connect;
except
case GetLastError of
9001:ShowMessage('DNS 服务器无法解释格式');
9002:ShowMessage('DNS 服务器失败');
10060:ShowMessage('由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败');
10061:ShowMessage('能做任何连接,因为目标机器积极地拒绝它');
...
end;
end;
lyguo 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kenshinggg 的回复:]
try
Result := UrlDownloadToFile(nil,  PChar(source),  PChar(Dest),  0,  nil)  =  0;
except
on E: Exception do begin
ShowMessage('error:'+ e.Message);
Result := False;
end;
end;
[/Quote]

就用这咱吧
coolspac 2008-09-30
  • 打赏
  • 举报
回复
另外,delphi中的except中的on xx do xx
转到bcb中对应是?
bcb中的
try
{
}
catch()
{
}

catch括号里面的好像是类型
coolspac 2008-09-30
  • 打赏
  • 举报
回复
这种的话,能够获得idftp抛出的异常的整个异常信息,是个ansistring。对这个ansistring进行判断的话,比较麻烦,有其他的异常判断的方法么?对于idftp来说
panrongzeng 2008-09-30
  • 打赏
  • 举报
回复
参照一下
panrongzeng 2008-09-30
  • 打赏
  • 举报
回复
try
Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
except
on E: Exception do begin
ShowMessage('error:'+ e.Message);
Result := False;
end;
end;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧