Dieser Artikel beschreibt, Delphi versuchen .. schließlich bauen, wenn zu verwenden, und wie Castalia macht es einfacher zu benutzen.

(Ursprünglich veröffentlicht im Delphi-expert.com am 16. März 2004)

In einer Branche, die mir viel Prüfung des Quellcodes, ich manchmal Hinweis gemeinsamen Gewohnheiten und Tendenzen in der Menschen-Code. Manchmal sind diese Gewohnheiten sind gut, wie mit Behauptungen. Manchmal sind die Gewohnheiten sind schlecht, wie Verwendung von Labels und gotos. Manchmal wird der Code einfach fehlen einige wichtige Elemente, die entweder aufgrund von Faulheit oder unzureichende Verständnis der Programmierer, schrieb den Code. Eines dieser Konstrukte, ist sehr leistungsfähig, aber oft vernachlässigt und manchmal auch missbraucht werden, ist Delphi die "versuchen" konstruieren. In den nächsten zwei Wochen werden wir sehen, was diese Konstrukte tun und wie man sie auch, und wie Castalia kann Ihnen dabei helfen, sie effektiv und nicht vernachlässigt werden.

Diese Woche werden wir auf die versuchen .. schließlich konstruieren. Nächste Woche werden wir ins Detail gehen zu versuchen .. außer, darunter auch einige Geschichte über das Konzept der Ausnahmen. Wir werden auch Spaß von Java, der kann uns lehren, viel mit seiner Over-the-Top-Ausnahmebehandlung Mechanismus.

Einführung

Manchmal ist es auch notwendig, um sicherzustellen, dass bestimmte Dinge getan werden, um eine Aufgabe, unabhängig von Fehlern, die möglicherweise bei der Ausführung der Aufgabe. Zum Beispiel, wenn eine Routine übernimmt die Kontrolle über eine Ressource, es ist in der Regel notwendig für die Routine, um die Ressourcen, auch wenn Fehler auftreten, in den Prozess einzubeziehen. Zum Beispiel, in den folgenden Code, F eine Datei geöffnet ist, einen Text geschrieben, und dann ist es geschlossen. Falls nicht, die Akte zu schließen würde zu einer Ressourcen-Leck und wäre ein erster Klasse Bug.

 
Reset (F);
WriteLn (F, "hallo, Welt!");
CloseFile (F);

Dieser Code funktioniert gut, solange jeder Funktion führt normalerweise, aber wenn etwas passiert, abnorme, dann gibt es Ärger. Zum Beispiel, wenn Reset (F) ist erfolgreich, aber aus irgendeinem Grund die Forderung nach WriteLn fehlschlägt, wird die Routine verlassen ohne jemals versucht, CloseFile (F). Als Ergebnis, wird die Datei nicht geschlossen werden, und eine Ressource wurde sickerte.

Wie können wir dieses Problem lösen? WriteLn nicht alle Fehler-Kontrolle-Mechanismus, wie einige Routinen machen (mehr dazu nächste Woche). Es führt einfach, und wenn etwas schief geht, wirft sie eine Ausnahme (Mehr dazu nächste Woche zu). In wenigen Worten, eine Ausnahme ist eine anormale Zustand bei der Ausführung eines Programms, die bewirken, dass die Strömung des Programms zu werden. Was wir brauchen, ist ein Weg, um sicherzustellen, dass CloseFile (F) wird genannt, auch wenn eine Ausnahme auftritt. Dies ist genau das, was die versuchen .. schließlich ist für die Konstruktion. Betrachten Sie den gleichen Code, aber mit der geschützten Datenflusskontrolle eines try-finally-Block:

 
Reset (F);
versuchen
WriteLn (F, "hallo, Welt!");
Schließlich
CloseFile (F);
Ende
;

Nun, wir haben dafür gesorgt, dass CloseFile (F) wird aufgerufen, egal, was passiert, während des Gesprächs zu WriteLn. Jetzt für eine formale Definition, aus der Delphi-Hilfe:

Die Syntax der Anweisung versuchen .. schließlich ist

versuchen statementList1 schließlich statementList2 Ende

wo jeder statementListist eine Folge von Anweisungen, die durch Semikolons. Die versuchen .. schließlich Erklärung führt die Anweisung in statementList1 (versuchen Sie die Klausel). Wenn statementList1 beendet, ohne dabei Ausnahmen, statementList2 (die schließlich Klausel) ausgeführt wird. Wenn eine Ausnahme ist, die während der Ausführung von statementList1, Kontrolle ist auf statementList2; einmal statementList2beendet die Ausführung, die Ausnahme ist wieder angesprochen. Wenn ein Anruf auf die Ausfahrt, Pause, Weiter oder Verfahren Ursachen Kontrolle zu verlassen s tatementList1, statementList2 wird automatisch ausgeführt. Damit endlich die Klausel ist immer ausgeführt, unabhängig davon, wie die versuchen Klausel beendet.

Nun haben wir ein Verständnis für die versuchen .. endlich bauen, und wenn, es zu benutzen, sollten wir prüfen, wie Castalia können.

Code-Vorlagen

Castalia bietet eine Reihe von Code-Templates, die das versuchen .. schließlich konstruieren. Bei der ersten Installation, Castalia umfasst die tryf und trycf Vorlagen. Die tryfVorlage erstellt eine einfache Gerüst für einen try-Block. So verwenden Sie die Vorlage tryf, geben Sie einfach "tryf" im Editor, und drücken Sie die Leertaste. Die Skelett-Code eingefügt werden:

 
versuchen
|
Schließlich
|
end;

Der Cursor wird sich an der entsprechenden Stelle in der Klausel versuchen. Nach der Erstellung des Codes in die versuchen Klausel, drücken Sie einmal, um direkt in die schließlich Klausel. Dann erstellen Sie Ihren Code cleanup.

die Vorlage trycf Adressen besonders die gemeinsame Nutzung der versuchen .. schließlich konstruieren in Delphi geschrieben. Dies ist die dynamische Erstellung und Vernichtung von Objekten. Bad Beispiel:

SaveToFile ( 'hello.txt'); 
MyStrings. Free;

Dies ist vergleichbar mit dem ersten Beispiel. Eine Ressource (Memory) zugewiesen wird - in diesem Fall von einem Konstruktor. Die Ressource wird manipuliert, dann ist die resoruce freigegeben durch das aufrufende MyStrings.Free. Wenn wir nicht nennen MyStrings.Free, den Speicher nicht freigegeben, und wir würden uns auf eine weitere Ressource Leck. Auch das Problem ist das gleiche. Wenn etwas schief geht, während der Manipulation der Speicher, der Destruktor wird nicht aufgerufen und der Speicher wird nie freigegeben. Hier ist der entsprechende Code:

 
MyStrings: = TStringlist. Create;
versuchen
MyStrings. Add ( 'hallo');
MyStrings. "Hinzufügen" ( "Welt"
);
MyStrings. SaveToFile ( 'hello.txt');
Schließlich
MyStrings. Free;
end;

Beachten Sie, dass MyStrings.Free wurde schließlich in die-Klausel, um sicherzustellen, dass egal was passiert in der Klausel versuchen, das Objekt wird freigegeben. Castalia trycf der Vorlage ist ein Skelett dieses Konstrukt. So verwenden Sie die Vorlage trycf, Typ "trycf" im Editor und drücken Sie die Leertaste. Die Skelett-Code eingefügt werden:

 
|: = |. Create;
versuchen
|
Schließlich
|. Free;
end;

Der Cursor befindet sich dort, wo die erste | Zeichen, und drücken springt auf jeden | in Ordnung. (Die | Zeichen erscheint nicht im Code, aber hier sind für die Zwecke der Klarheit). Sie sollten die trycfVorlage, wenn Sie das Erzeugen von Objekten dynamisch.

Sie können mehr über Castalia-Code-Templates hier.

Refactoring

Code-Templates sind nützlich, wenn wir uns schriftlich neuen Code, aber nicht sehr viel helfen, wenn wir die Änderung bereits bestehender Code im Einklang mit unserem neuen Verständnis der schließlich versuchen ... Castalia des Refactorings wird dazu beitragen, dass mit. Die "Surround mit ..." Refactoring ermöglicht es Ihnen, wählen Sie einen Block von Code und versuchen .. finally-Block um es mit nur wenigen Mausklicks. Wählen Sie einfach den Code ein, geht in die versuchenKlausel und klicken Sie mit der rechten Maustaste. Von der "Refactoring"-Menü, wählen Sie "Surround mit ..." und schließlich wählen Sie "versuchen .. endlich." Ihr Code wird sofort eingerückt und in einem ordnungsgemäßen versuchen .. finally-Block.

Sie können mehr über die automatisierte Castalia Refactoring Einrichtungen.

Diese Woche haben wir gelernt, wie Sie mit Delphi Versuchen endlich ..konstruieren, um Ressourcen-Lecks und andere Flow Control Probleme. Wir haben auch gelernt, wie Castalia können uns helfen, dieses Konstrukt besser mit den beiden neuen Code und vorhandenen Code. Nächste Woche schauen wir uns an, und versuchen .. außer lernen Castalia können uns helfen, besser zu schreiben Ausnahmebehandlung Code.

Average rating: