【问题标题】:Exceptions not displayed when running Delphi app运行 Delphi 应用程序时不显示异常
【发布时间】:2018-04-18 18:46:39
【问题描述】:

我正在运行 Delphi 10.2 Tokyo 的示例网络共享应用程序

C:\Users\Mike\Documents\Embarcadero\Studio\Projects\Tethering\PhotoWall\Mobile

在 Windows 和 iPad 上正常运行时,应用程序可以正常运行但无法正常运行。

当使用调试器(在 Windows 和 iPad 上)运行时,它会收到如下错误消息:

调试器异常通知

Project MobilePhotoApp 引发异常类 EIdSocketError,消息为 'Socket Error #48 地址已在使用中。'。

Project MobilePhotoApp 引发异常类 EIdCouldNotBindSocket 并带有消息“无法绑定套接字。地址和端口已在使用中。'。

如何让应用在没有调试器的情况下正常部署时显示这些错误?

【问题讨论】:

  • 它似乎正在尝试使用端口 2020。您必须已经有另一个应用程序使用该端口。奇怪的是,这来自 Indy,但我在这些使用 Indy 的示例应用程序中都没有看到任何内容。
  • 我特别问,因为像你的问题中的“调试器异常通知”没有出现,它是调试器内部使用的东西(并且可以为异常类型禁用)。如果不处理触发此内部调试器通知对话框的异常,通常会导致一个实际的错误对话框,用户可以看到该对话框。而且这里似乎不见了。
  • 实际上看起来IPPeer内部使用了Indy。此外,我也找不到引用端口2020 的位置。
  • 找到了。似乎 Delphi 中的网络共享库硬编码了这个端口,还有一些其他的。 System.Tether.NetworkAdapter 具有引用这些端口号的 TTetheringNetworkAdapterCommon
  • 我想在您的场景中以当前状态使用这个网络共享库是绝对不可能的,因此对您的问题 +1。有人在设计时做出了一些糟糕的决定。

标签: delphi exception-handling tethering


【解决方案1】:

在 cmets 的许多贡献者的帮助下,这似乎就是答案。

异常可能在网络库中处理,因为它搜索空闲端口。

我认为例外情况是在解释 Windows 10 上缺乏网络共享的问题。但是,当移动应用程序在Android 或 iPad。缺乏配对的问题很可能与 Windows 10 机器上的防火墙有关。

我在这个问题中询问了如何让 Windows 10 或其防火墙授予对 Delphi 网络共享应用程序的访问权限:Delphi apps won't tether on Windows 10

【讨论】:

  • 事实证明,McAfee Internet 阻止了 Delphi 网络共享应用程序。删除 McAfee 后,Windows 要求防火墙例外并允许网络共享应用程序配对。配对失败时,McAfee 和 Delphi 网络共享应用程序均未显示任何错误消息。
【解决方案2】:

在没有附加调试器的情况下运行应用时不会出现任何错误的原因是应用本身的设计方式可以自行处理这些异常。

根据异常名称,我猜测它们来自 Indy 网络库。 Indy 是 Delphi 附带的第三方网络库。大多数 Indy 组件的设计方式都不会引发任何异常,因为它们是在内部处理的。

您通常应该检查组件文档以了解处理错误的正确方法。但这可能会给您带来问题,因为 Indy 组件在内部由 Tethering 组件使用,这使一切变得非常复杂。

示例应用程序无法连接的最可能原因是,如果 Indy 组件被防火墙阻止,它们会迅速引发内部异常并放弃连接尝试。事实上,这通常发生得如此之快,以至于您的防火墙甚至不会询问您是否要允许您的程序建立该网络连接。
这是我不喜欢使用 Indy 组件的原因之一,因为我的 Eset Smart Security 从来没有足够快地显示确认对话框,让我无法建立网络连接。因此,在尝试使用 Indy 组件进行任何操作之前,我需要将此应用程序添加到防火墙异常中。

【讨论】:

  • “大多数 Indy 组件的设计方式是从不引发任何异常,因为它们是在内部处理的。”我认为这种说法是错误的。当然,他们提出了例外。主题是这些异常是否得到处理。
  • 我已经使用调试器在 iPad 上运行了移动网络共享 Photowall 应用程序。我得到了与 Windows 10 的错误类似的结果。这是否意味着 iPad 遇到了与 Windows 相同的问题?我仍然不清楚为什么在调试器中运行时会出现异常,但在正常运行时不会出现。
  • @MikeatBookup 说实话我不知道Photowall应用的原因是否和Windows一样,因为我个人没有任何移动开发经验,也没有测试它的能力。因此,您必须使用 Indy UDP 组件制作自己的小测试应用程序,该组件尝试在相同的端口范围内工作,以查看调试器是否会捕获相同的异常。
  • @MikeatBookup 至于为什么通过调试器运行应用程序时仍然出现异常。调试器将始终捕获任何异常,无论它们是否由应用程序处理。实际上,处理捕获的异常的代码只有在您单击继续或在检测到异常后尝试在 Delphi 中前进后才会运行。调试器不捕获某些异常的唯一方法是命令它忽略某些类型的异常。您可以通过更改工具->选项->调试器选项->语言异常中的Delphi选项来做到这一点
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2016-07-02
  • 1970-01-01
相关资源
最近更新 更多