Delphi XE8 如何优雅地处理应用程序启动时的 ETetheringException 问题。

8
Delphi 应用程序捆绑管理器在 2020-2039 端口范围内保留 20 个端口来启动其通信线程。当同一台计算机上启动第 21 个应用程序时,我想知道会发生什么情况。结果发现该应用程序只是挂起不响应,直到被杀死,我没有找到一种优雅地终止它的方法。
要重现此问题,请将 TTetheringManager 和 TTetheringProfile 放置在空窗体上,将配置文件连接到管理器,编译,在 IDE 外部启动应用程序 20 次,最后在 IDE 中启动第 21 个实例。
迄今为止,我已经发现以下内容:在 System.Tether.NetworkAdapter: procedure TTetheringNetworkManagerCommunicationThread.Execute 中,当 TCP 或 UDP 通信服务器无法启动时,会引发 ETetheringException.Create(SManagerNetworkCreation) 异常。到目前为止还不错。
此异常会在调试器中显示。当我继续并跟随以下代码时,应用程序最终在 System: function AcquireExceptionObject 中挂起,并且永远不会返回。
由于应用程序是在 Application.Run 期间引发的,因此我尝试通过以下方式捕获异常:
try
  Application.Run;
except
  ShowMessage('Something went terribly wrong!');
end;

但这个方法没有起作用。你有什么建议可以捕获(或防止)这个异常吗?

你应该能够为应用程序的 OnException 事件添加一个事件处理程序,并在那里处理异常。 - David Heffernan
谢谢您的建议,但这也没有帮助。我尝试设置Application.OnException,但是这个事件处理程序从未执行过。 异常也可以通过在运行时将TetherManager分配给TetherProfile来触发,例如:procedure TForm1.FormShow(Sender: TObject); begin try try TetheringAppProfile1.Manager := TetheringManager1; except ShowMessage('出了点问题:'); end; finally ShowMessage('最终成功了'); end; end; - Lübbe Onken
这看起来真的很丑 :/ 无论是except还是finally都没有被执行,应用程序就一直卡住了。 - Lübbe Onken
1
我已经使用madexcept运行了这个程序,它会显示/捕获异常。请参见此处:http://s25.postimg.org/j0l8xe7f3/Tether1.png http://s25.postimg.org/quluisf7z/Tether2.png 希望这能让您对正在发生的事情有一些了解。 - W.Prins
1
经过再次思考调用堆栈,有两个要点需要注意:1)主线程被阻塞/等待在WaitFor()中,可能等待某个信号来唤醒;2)发生在线程中的异常显然并没有唤醒主线程,因此异常永远不会被看到/处理,导致应用程序挂起等问题。这对我来说似乎是一个错误。至少我希望在这种情况下有一些逻辑可以确保在发生致命异常时唤醒主线程。 - W.Prins
显示剩余4条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接