【发布时间】:2015-02-26 09:21:32
【问题描述】:
我正在使用 Indy 的 FTP。
它完全符合我的要求,我唯一的问题是,如果系统未连接到 Internet 或服务器已关闭,则会在屏幕上显示 TimeOut 异常。
我似乎无法找出如何捕获异常。 我只是希望它能够显示我自己的消息,而不是显示错误,以向用户保证没有问题。如果这有意义的话。
我以前使用过 try excepts,但它们似乎在这里不起作用。 谁能给我一个想法或一些示例代码,说明在哪里以及如何在此处编写异常捕获器?
谢谢
编辑: 抱歉,我不在我的普通电脑旁,所以无法发布代码。 实际上我只是重试并且它确实抓住了它,感谢关于调试器总是显示异常的注释。 但是,在我的自定义消息之后,我还会收到“正常关闭连接”消息。 (我在调试器之外运行它) 我如何/在哪里可以抓住/阻止那个?
此外,它有时会从我的服务器返回一条消息,例如“无法在同一帐户上连接超过 3 次”或其他任何内容。我也可以停止/抓住它吗? 谢谢 这里:
Form1.ftp.Host := 'HOSTNAME';
Form1.ftp.User := 'USERNAME';
Form1.ftp.password := 'PASSWORD';
Try
Form1.ftp.Connect;
Except on E : Exception do
begin
ShowMessage('Timeout Error, dont worry');
end;
end;
【问题讨论】:
-
请发布您尝试使用 try stamtents 的代码。还要记住,当您通过调试器运行程序时,调试器将始终停止出现异常,除非您将某些异常类型添加为要忽略的异常。是的,即使您有代码可以正确处理它们,调试器也会在异常处停止,因为它会在该代码完全执行之前检测到异常。在这种情况下,只需按 F9 即可继续您的程序。如果您有处理异常的正确代码,您的自定义消息将显示,否则将弹出默认异常消息。
-
正如@SilverWarior 所说,在调试器中您可以看到引发的异常,包括它在对话框中的类型,例如
<project> raised exception class EIdReadTimeOut with message <text>。对您来说重要的部分是异常类。然后,您可以编写一个异常处理程序,该处理程序将在引发该类的异常时执行某些操作,例如try..except on E: EIdReadTimeOut do DoSomething; on E: EIdFTPException do DoSomethingElse; ... end;。一个示例骨架,但对于TIdHTTP是例如在this post. -
@TLama:Indy 中没有
EIdFTPException。并且取决于何时提出EIdReadTimeOut,TIdFTP可能会或可能不会在内部处理它。 -
@Remy,这只是一个例子。还有
EIdFTPException异常类。这是TIdFTP引发的异常的共同祖先。 -
@TLama:我的错,我现在看到
EIdFTPException。但是,它(及其后代)仅针对TIdFTP本身发生的错误(错误的属性/参数值、无效状态等)引发,而不是针对服务器响应 FTP 命令返回的错误消息。这些由EIdReplyRFCError(和后代)处理。
标签: delphi exception ftp try-catch indy