在全局异常处理程序中处理线程异常?
我有一个安装了全局异常处理程序的主应用程序。现在,对于在另一个线程中引发的一些特定异常,我希望调用全局异常处理程序。但它只处理来自主线程的异常。我也试图从内螺纹以下,但它不工作之一:在全局异常处理程序中处理线程异常?
RunInMainThread (procedure
begin
raise EExceptionFromWithinThread.Create;
end);
其中RunInMainThread
只是执行给定在主线程的上下文参数匿名方法。
为什么不能正常工作?处理这种情况的正确方法是什么?
这个怎么样:发送消息给主线程,应该引发异常。
这是一个非常好的主意。很好。 – 2010-09-03 12:26:43
谢谢,我会尝试。任何解释为什么它不适用于'Synchronize'(被RunInMainThread内部使用)? – jpfollenius 2010-09-03 12:28:48
@Smasher:nope,不知道:-( – splash 2010-09-03 12:46:16
我在线程中处理了异常,将消息保存为一个公共字符串变量。当线程状态改变时,我检查了主线程中的变量。使代码非常易读。
我不明白你想要做什么。一个异常意味着将当前执行点留给引发异常的第一个匹配处理程序,可能会在进程中解除堆栈。在另一个线程中同步调用异常处理程序有什么意义,然后继续下一行代码?当然有更合适的方式将信息发送到主线程。这看起来像是滥用我的异常。 – mghie 2010-09-03 13:31:39
我在说定期检查网络连接的线程中的'ELostConnection'异常。这个用例对我来说很自然。我需要的是一种全局异常处理程序,它处理来自所有线程的异常... – jpfollenius 2010-09-03 13:46:16
这是异常滥用。到任何东西到达主线程时,它不再是一个例外。主线程必须显式检查来自其他线程的消息。当它发现这个“raise exception”命令时,它会运行它,捕获异常,运行全局处理程序,然后从停止的地方继续(可能调用GetMessage)。主线程不会被中断,发送线程也不会做太多。在发送线程中,像往常一样引发异常。在OnTerminate事件中,检查'FatalException'并在那里处理它。 – 2010-09-03 14:27:40