2009-08-05 7 views
6

Ich habe Application.OnException auf einen benutzerdefinierten Ausnahmebehandler gesetzt, damit ich Abstürze protokollieren und eine Option zum Beenden geben kann. Ich stelle jedoch fest, dass dies auch für Ausnahmen gilt, die ich bereits behandelt habe, zum Beispiel Ausnahmen, die bei der Validierung von Zahleneingaben auftreten. Gibt es eine Möglichkeit, den benutzerdefinierten Ausnahmebehandler nur für nicht behandelte Ausnahmen ausführen zu lassen?Wie kann ich Delphi wissen lassen, dass ich bereits eine Ausnahme behandelt habe?

Edit: es stellt sich heraus, dass ich das erwartete Verhalten bekomme, wenn ich außerhalb des Debuggers laufen. Vielleicht ist es nur eine Debugger-Sache. Ich finde die Interaktion des Delphi-Debuggers mit Ausnahmen nicht so intuitiv, um es gelinde auszudrücken.

Antwort

14

Wenn sich das Verhalten innerhalb und außerhalb des Debuggers ändert, dann ist es nicht wirklich Ihr Programm, das Ihnen über Ausnahmen erzählt.

Why do I continue getting error messages even after I have written an exception handler?

Ein Auszug: Ich habe auf meiner Website über dieses Phänomen geschrieben

In den Standardeinstellungen, die Delphi IDE benachrichtigt Sie, wenn eine Ausnahme auftritt in Ihrem Programm ... . Was zu beachten ist, ist, dass zu diesem Zeitpunkt keine des Ausnahmebehandlungscodes Ihres Programms noch ausgeführt wurde. Es ist alles Delphi selbst; Sein spezieller Status als Debugger ermöglicht es, eine erste Benachrichtigung über eine Ausnahme in Ihrem Programm zu erhalten, noch bevor Ihr Programm darüber informiert ist.

Nachdem Sie das Meldungsfeld von Delphi geschlossen haben, wird die Ausführung an der besten Zeile Ihres Quellcodes pausiert, die Delphi als Quelle der Ausnahme finden könnte. Drücken Sie die "Run" -Taste, um Ihr Programm fortzusetzen. Die Steuerung wird zum nächsten oder außer Block weitergeleitet. Bevor Sie Ihr Programm fortsetzen, können Sie die verschiedenen Debugging-Tools verwenden, die Ihnen zur Verfügung stehen. Sie können die Werte beliebiger Variablen im Gültigkeitsbereich überprüfen und sogar ihre Werte ändern.

Also, wie benachrichtigen Sie Delphi, dass Sie bereits eine Ausnahme behandelt haben?Sie nicht - weil Ihr Programm es noch nicht behandelt hat. Und warum kann der Debugger nicht erkennen, ob Ihr Programm ist, um eine Ausnahme zu behandeln? Um dies zu tun, muss es Ihr Programm weiter ausführen. Das Fehlen eines Ausnahmebehandlers zu erkennen, ist so, als würde man das Halteproblem lösen. Die einzige Möglichkeit festzustellen, ob eine Ausnahme behandelt wird, besteht darin, das Programm ausführen zu lassen und dann festzustellen, ob die Ausnahme behandelt wird. Aber zu diesem Zeitpunkt ist es zu spät, um ein Debugging durchzuführen. Daher hat der Debugger keine andere Wahl, als sein Programm zu pausieren, wenn es zum ersten Mal eine Ausnahme entdeckt, und dann herauszufinden, was von dort zu tun ist.

Mein Artikel geht auf einige Möglichkeiten zu beschreiben, können Sie vermeiden, den Debugger fangen einige Ausnahmen, die hier zusammengefasst:

  • Verwenden erweiterte Haltepunkte vorübergehend deaktivieren auf Ausnahmen für bestimmte Regionen des Codes zu brechen.
  • Konfigurieren Sie den Debugger, um bestimmte Klassen von Ausnahmen (und ihre Nachkommen) zu ignorieren.
  • Informieren Sie den Debugger, Sie nicht über any Ausnahmen zu benachrichtigen.
  • Deaktivieren Sie das integrierte Debugging insgesamt.

Es gibt eine andere Optionen, die ich nicht in meinem Artikel enthalten war:

  • Ihr Programm ändern, so dass die Ausnahme nicht in erster Linie angehoben bekommt.

Sie sagen, dass Sie numerische Eingaben validieren. Das klingt für mich so, als ob Sie etwas wie das Aufrufen von StrToInt machen und dann die Ausnahme EConvertError abfangen, wenn die Eingabe keine gültige ganze Zahl ist. Das ist eine teure Methode zur Validierung von Eingaben. Verwenden Sie statt dessen TryStrToInt, um festzustellen, ob die Konvertierung erfolgreich war, oder StrToIntDef, die automatisch einen Standardwert zurückgibt, anstatt eine Ausnahme auszulösen. Eine weitere Option ist plain alt Val, die versucht, eine Zeichenfolge zu konvertieren, und wenn es fehlschlägt, teilt es Ihnen mit, welche Position in der Zeichenfolge den Fehler verursacht. Val ist besonders nützlich, wenn Sie so viele Zeichen wie möglich für die Konvertierung konsumieren und dann mit dem nächsten nicht-numerischen Zeichen weiter analysieren möchten.

+0

Wow, danke für alle Vorschläge. Die Ausnahme wird gehandhabt, wenn sie durch den Debugger läuft. Ich beobachte, wie sie den Ausnahmebehandlungscode durchläuft, aber dann springt sie zum generischen Handler. Ich werde in die anderen Optionen für die String-Konvertierung schauen, das ist wirklich die Hauptsache. – Erika

+0

+1 Große Antwort dort, Rob. – robsoft

+0

Was kann ich tun, wenn der Debugger in bestimmten Routinen nicht auf bestimmte Ausnahmetypen reagieren soll? Ich möchte sie nicht alle unterdrücken. – Paul

1

Eine Alternative könnte die Verwendung von Application.OnException sein. Aber um einfach alle Ausnahmen in Ihrer "Haupt" -Funktion abzufangen. Auf diese Weise können Sie alle zuvor nicht zwischengespeicherten Ausnahmen abfangen, die Ausnahme protokollieren und dann abstürzen.

+2

Genau dafür steht die Application.OnException-Methode. – jpfollenius

1

Application.OnException sollte nur für nicht behandelte Ausnahmen ausgelöst werden. Das erneute Auslösen einer Ausnahme in einem try-except-Block führt dazu, dass die Ausnahme von Application.OnException behandelt wird. Für die Eingabeüberprüfung, die eine Ausnahme auslöst, können Sie dem Benutzer eine Nachricht anzeigen und die Ausnahme dann erneut auslösen, wenn sie im Fehlerprotokoll aufgezeichnet werden soll.

+0

Das komische Ding ist, dass es schien, die Ausnahme ohne meine Hilfe wieder anzuheben. Aber als ich die Frage editiert habe, passiert das nur im Debugger. Seltsamkeit. Trotzdem danke. – Erika

4

aus der Dokumentation Zitiert (Delphi 7) auf TApplication.OnException

"Use OnException to change the default behavior that occurs when an exception is not 
handled by application code." 

So: Nur nicht behandelte Ausnahme wird in den OnException Event-Handler zur Verfügung. Was Sie dabei erleben, ist wahrscheinlich, dass die Delphi-IDE bei der Exception bricht. Dies ist (zumindest in Delphi 7) konfigurierbar.

In Delphi 7 können Sie es konfigurieren, indem Sie auf das Menü Extras-> Debugger-Optionen klicken. Wählen Sie dann die "Sprachausnahmen" aus und klicken Sie auf "An Delphi-Ausnahmen anhalten". In anderen Delphi-Versionen könnte dies jedoch anders sein.

Verwandte Themen