【发布时间】:2022-01-23 17:27:27
【问题描述】:
在 Indy TIdTCPServer 和 TIdTCPClient 中管理异常
我在本论坛的其他帖子和其他地方读到,在 Indy 组件中,异常(来自EIdException)是内部管理的。
因此,在 TCPServer Execute 方法中,不需要使用 try - catch 块。
但是如果在 TCPServer Execute 方法中出现另一种异常会怎样呢?
在我的服务器应用程序中,我在主窗体上放置了一个TIdTCPServer 组件,如果在它的Execute 方法中发生了一些不好的事情并且我不管理它,服务器就会停止。
显然我需要服务器运行,所以我使用try - catch 块,如果有异常(任何类型的异常),我重新启动服务器。
我不知道这是否是最好的做法。
有时,在 IDE 中运行服务器应用程序时,我得到了错误
Project CallMonitor.exe raised exception class EIdSocketError with message 'Socket Error # 10054 - Connection reset by peer.'.
可能是由在同一台计算机上运行的客户端(而不是在 IDE 中)引起的。 应用程序执行被阻止,如果我中断,代码会在 IdStack 文件中停止,那里有大的 READ ME!!!关于异常 10038。 我按 F9,应用程序继续运行。
对我来说,这不是很清楚会发生什么。我的try - catch 块在这种情况下有效吗?还是无用或有害?
我必须过滤 Indy 异常和其他异常?
在客户端,在我的应用程序中,主窗体中有一个 TIdTCPClient 对象,与服务器的连接在主线程中进行管理。然后有另一个线程来管理与服务器的通信。在通信线程Execute 方法中,我有一个try - catch 块和一个循环,在该循环中,我每2 秒或当用户请求数据并解码服务器答案时向服务器发送请求。
如果有EIdReadTimeout 异常,我会终止线程并重新启动它。对于其他异常,我终止线程,断开/连接 TIdTCPClient 并重新启动线程。
我认为这是一种不同的情况,因为在服务器中,异常是在 TIdTCPServer 线程中管理的,而在客户端中,异常是在仅使用 TCPClient->Socket 与服务器通信的线程中管理的,对吗?
感谢任何答案/评论/建议。
【问题讨论】:
标签: exception c++builder indy10