2010-04-13 76 views
9

我的代碼覆蓋了異常處理(try..except)。預計不會發生一些例外情況,並且一些例外情況經常發生,這是預期的和可以的。現在我想爲此代碼添加一些自動化測試。知道執行過程中發生了多少例外情況是很好的,所以我可以在以後看到預期的數量是否增加或意外發生了。我不想與混亂調試代碼的每個異常處理塊,所以我的問題是:是否有可能擁有全局異常掛鉤?

有沒有安裝某種全局異常處理的所有其它異常處理塊前右坐的方式?我正在尋找一箇中心位置來記錄這些例外情況。

感謝您的任何建議!

(如果這很重要:它是2009年德爾福)

回答

14

你可以做到以下幾點:

  • 保持System.RaiseExceptObjProc變量的值,在正常Delphi應用程序指向SysUtils.RaiseExceptObject
  • 創建您自己的「RaiseExceptObject」進程並將其分配給RaiseExceptObjProc變量
  • 在您自己的「RaiseExceptObject 「proc你可以做你想做的,然後調用保存的RaiseExceptObjProc值

有關詳細信息,請參閱上面的變量和過程聲明。

+0

嗚呼!這就是它:)非常感謝這個提示!並備案:1)簽名的'RaiseExceptObjProc':'程序(P:PExceptionRecord)'2)看來我沒有打電話給老'RaiseExceptObjProc'在我的處理程序3)我讀的地方,這是可用,因爲德爾福2009(對我有好處),但我不確定這個 – 2010-04-13 11:25:09

+0

好的SysUtils.pas已經分配了'RaiseExceptObjProc'。也許這應該被我的處理程序調用。 – 2010-04-13 11:51:05

+0

嘿,你能舉個例子嗎? :) – PresleyDias 2012-07-17 07:12:27

0

JCL有它自己的異常對話框。只需將此對話框添加到您的項目中,它將處理所有意外的異常。位於此JCL文件夾中的詳細信息:jcl \ experts \ debug。還有一步一步介紹如何使用它的howto文本文件。

+0

的OP是尋找掛接到* *處理異常了。 – 2010-04-13 10:47:44

8

我想你可以使用AddVectoredExceptionHandler API函數。

下面是關於如何使用一個小樣本:

var 
    f : TFileStream; 

    function VectoredHandler(ExceptionInfo : PEXCEPTION_POINTERS): LongInt; stdcall; 
    var 
     s : String; 
    begin 
     S := Format('Exception code %x address %p'#10#13, [ExceptionInfo^.ExceptionRecord^.ExceptionCode, 
     ExceptionInfo^.ExceptionRecord^.ExceptionAddress]); 
     f.WriteBuffer(PChar(s)^, Length(s) * sizeof(wchar)); 
     FlushFileBuffers(f.Handle); 
     OutputDebugString(PChar(Format('ExceptionCode: %x', [ExceptionInfo^.ExceptionRecord^.ExceptionCode]))); 
     result := EXCEPTION_CONTINUE_SEARCH ; 
    end; 


    initialization 
     AddVectoredExceptionHandler(0, VectoredHandler); 
+0

這在win32級別捕獲異常,Dmitry Arefiev的解決方案,但我更多的是你的預期。 – Remko 2010-04-13 11:01:43

+0

感謝您指出這個功能,我認爲這對於做純Win32的人來說可能非常方便。德米特里的解決方案對我而言更簡單。 – 2010-04-13 11:28:39

+0

+1因爲我只需要以支持德爾福的舊版本(例如德爾福6-7)這個API調用,其中RaiseExceptObjProc是不存在的。 – 2011-03-30 14:55:04

1

你可以自定義處理程序添加到madExcept那麼這將讓你得到一個完整的堆棧跟蹤,但也矣。

+0

但是*你會怎麼做? – Arafangion 2012-09-04 05:36:51

+0

@Arafangion我會先閱讀madExcept的文檔,它會告訴你所有你需要知道的信息。實質上,你創建了一個異常處理程序(try/except),然後將異常對象傳遞給HandleException,以便由madExcept進行處理,這非常神奇。 – mj2008 2012-09-04 07:49:30

+0

儘管如何處理* uncaught *異常,文檔是模糊的,尤其是當您開始關注SEH異常處理時。 – Arafangion 2012-09-04 16:28:09

相關問題