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.
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
+1 Große Antwort dort, Rob. – robsoft
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