在全局异常处理程序中处理线程异常?

问题描述:

我有一个安装了全局异常处理程序的主应用程序。现在,对于在另一个线程中引发的一些特定异常,我希望调用全局异常处理程序。但它只处理来自主线程的异常。我也试图从内螺纹以下,但它不工作之一:在全局异常处理程序中处理线程异常?

RunInMainThread (procedure 
       begin 
       raise EExceptionFromWithinThread.Create; 
       end); 

其中RunInMainThread只是执行给定在主线程的上下文参数匿名方法。

为什么不能正常工作?处理这种情况的正确方法是什么?

+0

我不明白你想要做什么。一个异常意味着将当前执行点留给引发异常的第一个匹配处理程序,可能会在进程中解除堆栈。在另一个线程中同步调用异常处理程序有什么意义,然后继续下一行代码?当然有更合适的方式将信息发送到主线程。这看起来像是滥用我的异常。 – mghie 2010-09-03 13:31:39

+0

我在说定期检查网络连接的线程中的'ELostConnection'异常。这个用例对我来说很自然。我需要的是一种全局异常处理程序,它处理来自所有线程的异常... – jpfollenius 2010-09-03 13:46:16

+0

这是异常滥用。到任何东西到达主线程时,它不再是一个例外。主线程必须显式检查来自其他线程的消息。当它发现这个“raise exception”命令时,它会运行它,捕获异常,运行全局处理程序,然后从停止的地方继续(可能调用GetMessage)。主线程不会被中断,发送线程也不会做太多。在发送线程中,像往常一样引发异常。在OnTerminate事件中,检查'FatalException'并在那里处理它。 – 2010-09-03 14:27:40

这个怎么样:发送消息给主线程,应该引发异常。

+0

这是一个非常好的主意。很好。 – 2010-09-03 12:26:43

+0

谢谢,我会尝试。任何解释为什么它不适用于'Synchronize'(被RunInMainThread内部使用)? – jpfollenius 2010-09-03 12:28:48

+0

@Smasher:nope,不知道:-( – splash 2010-09-03 12:46:16

我在我的框架中这样做,如果你有兴趣(http://www.csinnovations.com/framework_overview.htm)。

我在线程中处理了异常,将消息保存为一个公共字符串变量。当线程状态改变时,我检查了主线程中的变量。使代码非常易读。