【发布时间】:2012-08-15 16:26:32
【问题描述】:
我在我的 Delphi 7 Service 应用程序、Indy、Synapse、Zeolibs 等中使用了很多组件。
我的应用程序总体上是稳定的,我使用 Eurekalog 6 来捕获异常,但在极少数情况下,一些线程挂起,因为它调用的第 3 方函数挂起,例如Indy 在尝试发送电子邮件时卡住了。
在许多情况下,挂起的应用程序是我的客户所在的位置,我无法访问他们的计算机,因此我无法进行实时调试。我的应用程序需要高可用性,因此即使每年挂起一次,我的用户也无法接受。
我现在正在寻找最好的方法来处理这种调试不可行但我仍然需要应用程序自行恢复的情况。如果线程调用的函数挂起,线程是否可以终止?或者,我也可以在发生这种情况时重新启动整个服务。看门狗怎么样?实现它的最佳方法是什么?谢谢。
【问题讨论】:
-
看看 madshi 的madExcept。它将允许您的应用程序或您的用户发送整个堆栈跟踪并检测挂起的主线程。任何其他挂起的线程,您应该可以编写代码。
-
@LURD 在线程中处理异常有什么特别之处?任何线程、主线程或工作线程中的异常处理肯定都是相同的吗?
-
@DavidHeffernan,线程执行中未处理的异常很难发现。您必须在线程被释放之前检查线程属性
FatalException以获取异常。 -
@LURD 好吧,我总是将我的线程过程包装在一个 try/except 中,我猜这会是同样的事情。