2014-06-06 24 views
4

我有一個第三方單元,在單元的初始化部分引發異常。我如何在我的應用程序中捕獲這個異常?如何在Delphi的單元的初始化部分捕捉異常

+1

大衛可能會有答案:)我猜你可以通過在列表使用列表中的第三方單元之前添加你的「catch」單元來鉤住某些東西。這一定是可能的,因爲像MadExcept和EurekaLog這樣的庫掛鉤了例外。 – Graymatter

回答

3

你不能抓住這樣的事情。 RTL執行初始化部分,規則是不會引發異常。如果發生異常,則故障爲終端。

另一種解決方法是當初始化部分開始執行時,語言異常處理框架還沒有到位。本身作爲RTL初始化的一部分進行安裝。

解決方案是修復代碼,使其服從規則。在初始化部分中沒有引發異常。


嗯,我想你可以掛鉤執行初始化的RTL代碼,也許用異常彈性代碼替換那個RTL代碼。但是,重要的是什麼?如果一個初始化部分產生一個異常,唯一可以理解的假設是該單元沒有初始化,因此不適合使用。請不要試圖將自己的頭埋在沙中,而忽略真正的問題。修復第三方代碼。

+1

@RezaRahmati我沒有想到這最後一部分,但它是非常重要的。當你忽略異常時,你不能保證你的應用程序使用這個庫執行的任何代碼將按預期運行。這些事情有一種被人遺忘的習慣,當你最不期待的時候,它會非常難以忍受。 – Graymatter

+1

「你不能抓住這樣的事情。」 - 也許更正確的「你不應該抓這樣的事情」,但總的來說,我同意大衛。來自docwiki.embarcadero的注意:在單元的初始化部分引發異常可能不會產生預期的結果。正常的異常支持來自SysUtils單元,必須在這種支持可用之前進行初始化。如果在初始化過程中發生異常,所有初始化的單元(包括SysUtils)都會完成並重新生成異常。然後通常通過中斷程序來捕獲和處理異常。 –

+0

你甚至不能(只是嘗試)掛鉤到你自己的UNIT中的Application.OnException(它必須在導致異常的UNIT之前加載) - 可能是因爲「所有初始化的單元 - 包括SysUtils - 都已最終確定,異常被重新提出。「 Application.OnException處理程序永遠不會被調用。所以看起來,如果沒有一些嚴重的黑客攻擊,你不能這樣做。也就是說,我同意這裏描述的其他觀點 - 這種例外(在UNIT的初始化過程中)總是會導致進程終止,因爲程序的結果條件是未定義的... – HeartWare

-1

你可以嘗試類TApplicationEvents的OnExceptionEvent,但我不確定這是否工作。

+0

當你不確定的時候請參考[documentation](http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TApplication.OnException) :*「OnException僅處理消息處理期間發生的異常。」*。 –