【问题标题】:Delphi FTP timeout exceptionDelphi FTP超时异常
【发布时间】: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。并且取决于何时提出EIdReadTimeOutTIdFTP 可能会或可能不会在内部处理它。
  • @Remy,这只是一个例子。还有EIdFTPException 异常类。这是TIdFTP 引发的异常的共同祖先。
  • @TLama:我的错,我现在看到EIdFTPException。但是,它(及其后代)仅针对TIdFTP 本身发生的错误(错误的属性/参数值、无效状态等)引发,而不是针对服务器响应 FTP 命令返回的错误消息。这些由EIdReplyRFCError(和后代)处理。

标签: delphi exception ftp try-catch indy


【解决方案1】:

与 Indy 中的大多数组件一样,TIdFTP 同步执行所有操作,并将错误报告为异常。标准 try/except 块工作得很好。 Indy 就是为此而设计的。

如果您在调试器之外运行您的应用程序时看到Connection Closed Gracefully 消息,这意味着您在套接字已断开连接后尝试执行套接字操作,并且您没有捕捉到EIdConnClosedGracefully 异常提升到您的代码中。例如,如果Connect() 失败,它会在向您引发异常之前在内部调用Disconnect()。在这种情况下不要调用任何其他TIdFTP 方法,如果需要,请再次调用Connect()

对于 FTP 服务器发送的错误消息,它们通常通过引发 EIdReplyRFCError(或派生的)异常来报告,您可以在代码中捕获这些异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2015-01-28
    • 2015-11-29
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多