2010-04-13 30 views
9

mein Code ist ziemlich gut mit Ausnahme behandelt (try..except). Es wird nicht erwartet, dass einige Ausnahmen auftreten, und einige Ausnahmen treten ziemlich häufig auf, was erwartet wird und in Ordnung ist. Jetzt möchte ich einige automatisierte Tests für diesen Code hinzufügen. Es wäre gut zu wissen, wie viele Ausnahmen während der Ausführung aufgetreten sind, so dass ich später sehen kann, ob die erwartete Anzahl erhöht wurde oder etwas Unerwartetes passiert ist. Ich möchte nicht jeden Ausnahmebehandlungsblock mit Debug-Code durcheinander bringen, also lautet meine Frage:Ist es möglich, einen globalen Ausnahme-Hook zu haben?

Gibt es eine Möglichkeit, irgendeine Art von globalem Ausnahmehandler zu installieren, der direkt vor allen anderen Ausnahmebehandlungsblöcken sitzt? Ich suche nach einem zentralen Ort, um diese Ausnahmen zu protokollieren.

Vielen Dank für Anregungen!

(Und wenn dies wichtig ist: es ist Delphi 2009)

Antwort

14

Sie folgendes tun:

  • den Wert System.RaiseExceptObjProc Variable erhalten, die in normalen Delphi App zeigt auf SysUtils.RaiseExceptObject
  • your own "RaiseExceptObject" proc erstellen und weist es die RaiseExceptObjProc Variable
  • in Ihrer eigenen „RaiseExceptObject "proc Sie können tun, was Sie wollen, dann rufen Sie gespeicherte RaiseExceptObjProc Wert

Für Details siehe oben Variable und Prozedur Deklarationen.

+0

Woohoo! Das war's :) Vielen Dank für diesen Tipp! Und für die Aufzeichnung: 1) Signatur von 'RaiseExceptObjProc':' Prozedur (P: PExceptionRecord) '2) es scheint, dass ich nicht das alte' RaiseExceptObjProc' in meinem Handler aufrufen muss 3) Ich habe irgendwo gelesen, dass dies seit Delphi verfügbar ist 2009 (gut für mich), aber ich bin mir nicht sicher –

+0

Ok SysUtils.pas weist bereits 'RaiseExceptObjProc' zu. Vielleicht sollte das tatsächlich von meinem Hundeführer aufgerufen werden. –

+0

hey kannst du bitte ein beispiel geben? :) – PresleyDias

0

JCL hat einen eigenen Ausnahme-Dialog ist. Fügen Sie diesen Dialog einfach Ihrem Projekt hinzu, damit alle unerwarteten Ausnahmen behandelt werden. Detaillierte Informationen in diesem JCL-Ordner: jcl \ experts \ debug. Es gibt auch Howto-Text-Datei, die Schritt für Schritt beschreibt, wie man es benutzt.

+0

Das OP sucht auch nach * behandelten * Ausnahmen. –

8

Ich denke, Sie können die API-Funktion AddVectoredExceptionHandler verwenden.

Hier ist eine kleine Probe auf wie man verwendet:

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

Das fängt Ausnahmen auf der Win32-Ebene, Dmitry Arefiev Lösung aber mir mehr, was Sie erwartet. – Remko

+0

Danke, dass Sie auf diese Funktionen hingewiesen haben, ich denke, das könnte nützlich sein für jemanden, der reines Win32 macht. Dmitrys Lösung war in meinem Fall einfach einfacher. –

+0

+1 Weil ich gerade diesen API-Aufruf benötigt habe, um ältere Versionen von Delphi (z. B. Delphi 6-7) zu unterstützen, in denen RaiseExceptObjProc nicht existiert. –

1

Sie könnten einen benutzerdefinierten Handler zu madExcept hinzufügen, der Ihnen dann ermöglichen würde, einen vollständigen Stack-Trace zu erhalten, aber auch weitermachen.

+0

Aber * wie * würdest du das tun? – Arafangion

+0

@Arafangion Ich würde beginnen, indem ich die Dokumentation für madExcept lese, die Ihnen alles erzählen wird, was Sie wissen müssen. Im Wesentlichen erstellen Sie einen Ausnahmebehandler (try/exception) und übergeben dann das Ausnahmeobjekt an HandleException zur Verarbeitung durch madExcept, was die Magie tut. – mj2008

+0

Die Dokumentation ist vage darüber, wie mit den * uncaught * Ausnahmen umzugehen ist, insbesondere wenn Sie anfangen, sich um die SEH Exception Behandlung zu kümmern. – Arafangion

Verwandte Themen