2010-09-03 200 views
2

我有一個安裝了全局異常處理程序的主應用程序。現在,對於在另一個線程中引發的一些特定異常,我希望調用全局異常處理程序。但它只處理來自主線程的異常。我也試圖從內螺紋以下,但它不工作之一:在全局異常處理程序中處理線程異常?

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

回答

4

這個怎麼樣:發送消息給主線程,應該引發異常。

+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

1

我在線程中處理了異常,將消息保存爲一個公共字符串變量。當線程狀態改變時,我檢查了主線程中的變量。使代碼非常易讀。