Update-Verlauf: Nr. 2
Aktualisierungszeit: 21.10.2001 02:42
Aktualisiert von: Musicwind®
Update-Hinweis: Geändertes Format.
Update-Verlauf: Nr. 1
Aktualisierungszeit: 2001-10-19 21:15
Aktualisiert von: Musicwind®
Update-Hinweise: Erstellt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~
Vorwort: Ich beschäftige mich seit mehr als drei Jahren mit Delphi , aber jedes Mal, wenn ich die Hilfedokumentation von Delphi lese , lerne ich immer noch viel, sodass ich nicht anders kann, als darüber zu seufzen , wie umfassend Delphi ist! Obwohl ich mich schäme, werde ich einige meiner Erfahrungen und Gewinne zusammenfassen und meine Ermutigung mit denen unter Ihnen teilen, die genauso arrogant und weniger sachkundig sind wie ich.
1. Was ist eine stille Ausnahme? (Warum nicht Schweigen der Lämmer? ;- ))
Stille Ausnahmen, also Slient Exceptions , beziehen sich auf den Ausnahmetyp, der standardmäßig keine störenden Nachrichtenaufforderungen verursacht: EAbort . In Object Pascal ist die Ausnahmeklasse EAbort die Vorgängerklasse aller stillen Ausnahmeklassen (und EAbort erbt Exception). Das Auslösen eines EAbort führt dazu, dass ein Ausführungsmodul angehalten wird, bis das äußerste Ausnahmebehandlungsmodul es abfängt, es wird jedoch kein Meldungsfeld mit einem roten Stoppschild angezeigt. Beziehen Sie sich auf den folgenden Code:
versuchen
ShowMessage('Hallo1');
Raise EAbort.Create('Abort it');
ShowMessage('Hello2');
außer
auf E: Ausnahme tun
showmessage('On Exception');
Ende;
Das Ausführungsergebnis zeigt zwei Meldungsfelder an, eines ist „Hello1“ und das andere ist „On Exception“. Dies zeigt, dass EAbort funktioniert, da die Anweisung „ShowMessage('Hello2')“ übersprungen wird und gleichzeitig das Meldungsfeld „Abort it“ nicht angezeigt wird, was auch die Funktion der EAbort-Ausnahmeklasse bestätigt, dass kein Dialog angezeigt wird (Dies gilt auch während des Entwurfs). Das Meldungsfeld „Bei Ausnahme“ weist darauf hin, dass es sich bei EAbort möglicherweise um eine Anomalie handelt, die sich von gewöhnlichen Ausnahmen unterscheidet. Dies hindert uns jedoch nicht daran, die alte Try-Except-Anweisung zu verwenden, um sie abzufangen .
2. Warum EAbort verwenden ?
EAbort ist in bestimmten Situationen nützlich. Zum Beispiel, wenn wir einen Vorgang beenden müssen, aber nicht möchten, dass Benutzer es bemerken (wir möchten nicht, dass sie das Standard-Ausnahmemeldungsfeld sehen). Um den gleichen Effekt zu erzielen, können Sie natürlich auch normale Ausnahmen verwenden (z. B. das Try-Except-Satzmuster verwenden, den Code in den Try-Abschnitt einfügen, eine Ausnahme auslösen, wenn Sie den Vorgang beenden müssen, und nicht schreiben). (jeder Code im Except-Abschnitt), aber nichts davon ist so einfach und direkt wie die Verwendung von EAbort.
3. Gibt es etwas Einfacheres? --Verwendung des Abbruchprozesses
Abort, ein in der SysUtils-Einheit definierter Prozess, ermöglicht uns die bequeme Verwendung von EAbort. Sehen Sie sich den Implementierungsquellcode von Abort an:
Prozedurabbruch;
Funktion ReturnAddr: Zeiger;
asm
MOV EAX,[EBP + 4]
Ende;
beginnen
raise EAbort.Create(SOperationAborted) bei ReturnAddr;
Ende;
SOperationAborted ist hier normalerweise „Operation abgebrochen“.
4. Schleier lüften – Umsetzungsprinzip
Vielleicht sind Sie, wie ich, neugierig, warum EAbort schweigt. Was hat Delphi intern mit EAbort gemacht? Finden wir es gemeinsam heraus.
Öffnen Sie ein neues Projekt, klicken Sie auf „In Dateien suchen“, geben Sie das Schlüsselwort „EAbort“ ein, aktivieren Sie dann das Optionsfeld „In Verzeichnissen suchen“ und stellen Sie das Bearbeitungsfeld „Dateimaske“ in den Suchverzeichnisoptionen auf den Namen des Verzeichnisses ein, in dem sich der Delphi-Quellcode befindet (z. B wie meins Ja: D:ProgrammeBorlandDelphi6Source), und vergessen Sie nicht, Unterverzeichnis einschließen zu aktivieren. Klicken Sie abschließend auf „OK“, um die Suche zu starten.
Als Ergebnis haben wir herausgefunden, dass es im Delphi-Quellcode bis zu 17 Stellen gibt, die mit EAbort in Zusammenhang stehen. Mit Ausnahme der beiden Deklarationen von EAbort und einiger Kommentaranweisungen in der Sysutils-Unit haben wir festgestellt, dass der größte Teil des Codes dem folgenden ähnelt:
wenn ExceptObject EAbort ist, dann
sowie:
wenn nicht (E ist EAbort), dann
usw.
Alle haben eine spezielle Behandlung für EAbort basierend auf RTTI – es stellt sich heraus, dass die Implementierung von EAbort so einfach ist!
Die beiden Einheiten, die Aufmerksamkeit verdienen, sind: Forms (die Linux-Version ist QForms) und AppEvnts. Die Antwort auf die Frage ist im Code der ersteren leichter zu finden. Siehe Delphi-Quellcode:
procedure Tapplication.HandleException(Sender: TObject);
beginnen
wenn GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
Wenn ExceptObject eine Ausnahme ist, dann
beginnen
Wenn nicht (ExceptObject ist EAbort), dann
wenn Assigned(FOnException) dann
FOnException(Sender, Exception(ExceptObject))
anders
ShowException(Exception(ExceptObject));
Ende sonst
SysUtils.ShowException(ExceptObject, ExceptAddr);
Ende;
5. Der Unterschied zwischen Abort , Break und Exit
Abort, Break und Exit sind etwas ähnlich, aber dennoch sehr unterschiedlich. Break wird verwendet, um eine Schleife in einer Schleifenanweisung zu verlassen. Exit wird verwendet, um aus dem aktuell ausgeführten Funktionskörper (oder Prozesskörper) herauszuspringen. Mit Abort können Sie aus einer oder mehreren Codeebenen springen, bis es Code zum Abfangen einer Ausnahme gibt, der diese abfängt.
6. Passen Sie stille Ausnahmen an
Genau wie beim Deklarieren einer Unterklasse einer normalen Ausnahmeklasse machen Sie einfach EAbort und seine Unterklassen zu Vorfahrenklassen:
TMyException = Class(EAbort);
TNextException = Class(EAbort);
usw.
Musicwind®@HangZhou.Zhejiang.China
20.10.2001
Weitere Artikel
[ Ende des Artikels]