Dieser Artikel beschreibt die Delphi Versuch... schließlich zu konstruieren, wenn es zu benutzen, und wie Castalia macht es einfacher zu bedienen.
(Ursprünglich veröffentlicht auf Delphi-Expert.de am 16. März 2004)
In einer Branche, die hat mich viel Source-Code untersuchen, merke ich manchmal gemeinsame Gewohnheiten und Trends in der Volkspartei-Code. Diese Gewohnheiten sind manchmal gut, wie mit Behauptungen. Die Gewohnheiten sind manchmal schlecht, wie Verwenden von Beschriftungen und Gotos. Manchmal fehlt der Code einfach einige sehr wichtige Elemente, die entweder aufgrund von Faulheit oder unzureichenden Verständnis seitens des Programmierers der geschriebenen Code. Eines dieser Konstrukte, die ist sehr mächtig, aber oft vernachlässigten und manchmal missbraucht, ist Delphi 'versuchen' Konstrukt. In den nächsten zwei Wochen werden wir schauen was tun diese Konstrukte und wie man sie auch benutzt, und wie Castalia können Sie diese effektiv zu verwenden und nicht zu vernachlässigen.
In dieser Woche konzentrieren wir uns auf die Try... schließlich zu konstruieren. Nächste Woche gehen wir ins Detail mit Try... außer, einschließlich einige der Geschichte auf dem Konzept der Ausnahmen. Wir werden auch über Java, lustig machen, wer kann uns viel Lehren mit der Over-the-Top-Ausnahmebehandlung.
Einführung
Manchmal müssen Sie sicherstellen, dass bestimmte Dinge getan werden, um eines Vorgangs unabhängig von Störungen in der Ausführung des Tasks aufgetreten sein könnten. Beispielsweise wenn eine Routine Kontrolle einer Ressource übernimmt, ist es normalerweise notwendig für die Routine, um die Ressource freigegeben, auch wenn dabei Fehler auftreten. Z. B. im folgenden Code eine Datei F geöffnet, einige Text geschrieben wird und dann geschlossen ist. Fehl, die Datei zu schließen würde dazu führen, dass eine Ressource-Lecks und wäre ein erster Klasse Bug.
Zurücksetzen von() F);
WriteLn ()F, 'Hello, World!' );
CloseFile() F);
Dieser Code funktioniert prima, solange jede Funktion normalerweise führt, aber wenn etwas abnorme geschieht, dann gibt es Ärger. Beispielsweise wird wenn Reset(F) erfolgreich ist, aber aus irgendeinem Grund kann der Aufruf von WriteLn fehlschlägt, die Routine beendet, ohne jemals versucht CloseFile(F). Dadurch wird die Datei nie geschlossen und eine Ressource geleckt worden.
Wie lösen wir dieses Problem? WriteLn bietet keine Fehlerüberprüfung Mechanismen wie einige Routinen nicht (mehr auf, dass nächste Woche). Einfach wird ausgeführt, und wenn etwas schief geht, es löst eine Ausnahme (mehr auf, dass nächste Woche zu). Kurz gesagt, ist eine Ausnahme eine abnormale Bedingung bei der Ausführung eines Programms, das bewirkt, dass der Programmablauf unterbrochen werden. Was wir brauchen, ist ein Weg, um sicherzustellen, dass die CloseFile(F) aufgerufen wird, selbst wenn eine Ausnahme auftritt. Dies ist genau das, was beim Versuch... Schließlich ist Konstrukt. Betrachten Sie den gleichen Code, aber mit der geschützten Regelung von einer Try-finally-Block:
Reset(F);
versuchen Sie
WriteLn ()F, 'Hello, World!' );
Schließlich
CloseFile() F);
Ende ;
Jetzt haben wir dafür gesorgt, dass die CloseFile(F) aufgerufen wird, egal was beim Aufruf WriteLn passiert. Jetzt für eine formellere Definition direkt aus der Delphi-Hilfe:
Die Syntax eines try... endlich -Anweisung istschließlich versuchen, statementList1 statementList2 Ende
wobei jedes StatementList eine Abfolge von Anweisungen, die mit Semikola getrennt ist. Die versuchen... Schließlich Erklärung führt die Anweisung in statementList1 (Klausel versuchen ). StatementList2 (der finally -Klausel) wird ausgeführt, wenn statementList1 abschließt ohne Auslösen von Ausnahmen. Wenn eine Ausnahme während der Ausführung von statementList1ausgelöst wird, wird die Steuerung auf statementList2übertragen; Sobald statementList2 die Ausführung abgeschlossen ist, ist die Ausnahme erneut angehoben. Wenn ein Aufruf der Prozedur Beenden, unterbrechenoder weiter Steuerelement statementList1verlassen wird, wird die statementList2 automatisch ausgeführt. Somit wird die finally -Klausel immer ausgeführt, unabhängig davon, wie die Klausel versuchen beendet.
Jetzt haben wir ein Verständnis der Try... Schließlich hilft Konstrukt und wann man es verwenden, lassen Sie uns betrachten, wie Castalia.
Code-Vorlagen
Castalia bietet eine Reihe von Code-Vorlagen, bei denen die Try... schließlich zu konstruieren. Bei der Erstinstallation, enthält Castalia Tryf und Trycf Vorlagen. Die Tryf Vorlage erstellt ein einfaches Skelett für einen Try-Block. Um die Tryf-Vorlage verwenden, geben Sie einfach 'Tryf' im Editor und drücken Sie die Leertaste. Der Skelett Code wird eingefügt:
versuchen Sie
|
Schließlich
|
Ende ;
Der Cursor wird an der entsprechenden Stelle in der Klausel versuchen befinden. Drücken Sie nachdem Sie den Code in der Klausel versuchen haben einmal in den finally -Klausel zu springen. Dann erstellen Sie Ihren Bereinigungscode.
die Trycf Vorlage behandelt eine besonders häufige Verwendung der -try... Schließlich in Delphi zu konstruieren. Dies ist die dynamische Erstellung und Zerstörung von Objekten. Schlechtes Beispiel:
MyStrings : = TStringList. Erstellen von;
MyStrings. Add('Hello');
MyStrings. Add('World');
MyStrings. SaveToFile()'hello.txt');
MyStrings. Kostenlose;
Dies ist ähnlich wie im ersten Beispiel. Eine Ressource (Speicher) ist reserviert wird - in diesem Fall durch einen Konstruktor. Die Ressource ist manipuliert, dann die Resoruce durch die aufrufende MyStrings.Free aufgehoben wird. Wenn wir MyStrings.Free nicht aufgerufen haben, die Erinnerung würde nicht aufgehoben und wir würde noch eine weitere Ressource Leck betrachten. Auch hier ist das Problem das gleiche. Wenn etwas schief beim Bearbeiten von Speicher geht, der Destruktor nicht aufgerufen, und der Speicher nie aufgehoben wird. Hier ist der entsprechende Code:
MyStrings : = TStringList. Erstellen von;
versuchen Sie
MyStrings. Add('Hello');
MyStrings. Add('World');
MyStrings. SaveToFile()'hello.txt');
Schließlich
MyStrings. Kostenlose;
end ;
Beachten Sie, dass MyStrings.Free verschoben wurde in den finally -Klausel, um sicherzustellen, dass egal was in der Klausel versuchen passiert , das Objekt freigegeben wird. Die Castalia Trycf Vorlage bietet ein Skelett für dieses Konstrukt. Um die Trycf-Vorlage verwenden, geben Sie 'Trycf' im Editor, und drücken Sie die Leertaste. Der Skelett Code wird eingefügt:
| := | . Erstellen von;
versuchen Sie
|
Schließlich
| . Kostenlose;
end ;
Der Cursor wird gefunden werden wo die erste | Charakter ist, und drücken springt jedem | in Ordnung. (Die | Zeichen erscheint nicht im Code, sondern dienen der Absicherung Klarheit hier). Verwenden Sie die Trycf -Vorlage, wenn Sie Objekte dynamisch erstellen.
Sie erfahren mehr über Castalias Code-Vorlagen hier.
Die Umgestaltung
Code-Vorlagen sind nützlich, wenn wir neuen Code schreiben, aber nicht sehr viel wenn wir vorhandenen Code gemäß unserer neuen Verständnis try ändern helfen... Schließlich. Castalia des Refactorings wird dabei behilflich sein. Die Umgestaltung der 'Surround mit...' können Sie wählen einen Codeblock und legen einen Versuch... Schließlich Block um es mit nur wenigen Mausklicks. Wählen Sie den Code, der in der Klausel versuchen geht einfach und klicken sie mit der rechten Maustaste. Im Menü 'Refactoring' wählen Sie 'Surround mit...' und schließlich 'versuchen... endlich.' Code wird sofort eingezogen und eingeschlossen in einen richtigen ... Schließlich Block.
Erfahren Sie mehr über die Castalia Umgestaltung Ausstattung hier automatisiert.
Diese Woche haben wir gelernt, wie mithilfe von Delphi versuchen... Schließlich Konstrukt Ressourcenverluste und andere Fluss Steuerelement Probleme zu vermeiden. Wir haben auch gelernt, wie Castalia hilft uns, dieses Konstrukt effektiver mit neuen Code und vorhandenen Code zu verwenden. Nächste Woche betrachten wir versuchen... außer und lernen Sie, wie Castalia uns bessere Ausnahmebehandlungscode schreiben.
Mit Try... endlich Ressource zu vermeiden Lecks
Mit Try... endlich Ressource zu vermeiden Lecks : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Dieser Artikel beschreibt die Delphi Versuch... schließlich zu konstruieren, wenn es zu benutzen, und wie Castalia macht es einfacher zu bedienen.
(Ursprünglich veröffentlicht auf Delphi-Expert.de am 16. März 2004)
In einer Branche, die hat mich viel Source-Code untersuchen, merke ich manchmal gemeinsame Gewohnheiten und Trends in der Volkspartei-Code. Diese Gewohnheiten sind manchmal gut, wie mit Behauptungen. Die Gewohnheiten sind manchmal schlecht, wie Verwenden von Beschriftungen und Gotos. Manchmal fehlt der Code einfach einige sehr wichtige Elemente, die entweder aufgrund von Faulheit oder unzureichenden Verständnis seitens des Programmierers der geschriebenen Code. Eines dieser Konstrukte, die ist sehr mächtig, aber oft vernachlässigten und manchmal missbraucht, ist Delphi 'versuchen' Konstrukt. In den nächsten zwei Wochen werden wir schauen was tun diese Konstrukte und wie man sie auch benutzt, und wie Castalia können Sie diese effektiv zu verwenden und nicht zu vernachlässigen.
In dieser Woche konzentrieren wir uns auf die Try... schließlich zu konstruieren. Nächste Woche gehen wir ins Detail mit Try... außer, einschließlich einige der Geschichte auf dem Konzept der Ausnahmen. Wir werden auch über Java, lustig machen, wer kann uns viel Lehren mit der Over-the-Top-Ausnahmebehandlung.
Einführung
Manchmal müssen Sie sicherstellen, dass bestimmte Dinge getan werden, um eines Vorgangs unabhängig von Störungen in der Ausführung des Tasks aufgetreten sein könnten. Beispielsweise wenn eine Routine Kontrolle einer Ressource übernimmt, ist es normalerweise notwendig für die Routine, um die Ressource freigegeben, auch wenn dabei Fehler auftreten. Z. B. im folgenden Code eine Datei F geöffnet, einige Text geschrieben wird und dann geschlossen ist. Fehl, die Datei zu schließen würde dazu führen, dass eine Ressource-Lecks und wäre ein erster Klasse Bug.
Zurücksetzen von() F);
WriteLn ()F, 'Hello, World!' );
CloseFile() F);
Dieser Code funktioniert prima, solange jede Funktion normalerweise führt, aber wenn etwas abnorme geschieht, dann gibt es Ärger. Beispielsweise wird wenn Reset(F) erfolgreich ist, aber aus irgendeinem Grund kann der Aufruf von WriteLn fehlschlägt, die Routine beendet, ohne jemals versucht CloseFile(F). Dadurch wird die Datei nie geschlossen und eine Ressource geleckt worden.
Wie lösen wir dieses Problem? WriteLn bietet keine Fehlerüberprüfung Mechanismen wie einige Routinen nicht (mehr auf, dass nächste Woche). Einfach wird ausgeführt, und wenn etwas schief geht, es löst eine Ausnahme (mehr auf, dass nächste Woche zu). Kurz gesagt, ist eine Ausnahme eine abnormale Bedingung bei der Ausführung eines Programms, das bewirkt, dass der Programmablauf unterbrochen werden. Was wir brauchen, ist ein Weg, um sicherzustellen, dass die CloseFile(F) aufgerufen wird, selbst wenn eine Ausnahme auftritt. Dies ist genau das, was beim Versuch... Schließlich ist Konstrukt. Betrachten Sie den gleichen Code, aber mit der geschützten Regelung von einer Try-finally-Block:
Reset(F);
versuchen Sie
WriteLn ()F, 'Hello, World!' );
Schließlich
CloseFile() F);
Ende ;
Jetzt haben wir dafür gesorgt, dass die CloseFile(F) aufgerufen wird, egal was beim Aufruf WriteLn passiert. Jetzt für eine formellere Definition direkt aus der Delphi-Hilfe:
Die Syntax eines try... endlich -Anweisung istschließlich versuchen, statementList1 statementList2 Ende
wobei jedes StatementList eine Abfolge von Anweisungen, die mit Semikola getrennt ist. Die versuchen... Schließlich Erklärung führt die Anweisung in statementList1 (Klausel versuchen ). StatementList2 (der finally -Klausel) wird ausgeführt, wenn statementList1 abschließt ohne Auslösen von Ausnahmen. Wenn eine Ausnahme während der Ausführung von statementList1ausgelöst wird, wird die Steuerung auf statementList2übertragen; Sobald statementList2 die Ausführung abgeschlossen ist, ist die Ausnahme erneut angehoben. Wenn ein Aufruf der Prozedur Beenden, unterbrechenoder weiter Steuerelement statementList1verlassen wird, wird die statementList2 automatisch ausgeführt. Somit wird die finally -Klausel immer ausgeführt, unabhängig davon, wie die Klausel versuchen beendet.
Jetzt haben wir ein Verständnis der Try... Schließlich hilft Konstrukt und wann man es verwenden, lassen Sie uns betrachten, wie Castalia.
Code-Vorlagen
Castalia bietet eine Reihe von Code-Vorlagen, bei denen die Try... schließlich zu konstruieren. Bei der Erstinstallation, enthält Castalia Tryf und Trycf Vorlagen. Die Tryf Vorlage erstellt ein einfaches Skelett für einen Try-Block. Um die Tryf-Vorlage verwenden, geben Sie einfach 'Tryf' im Editor und drücken Sie die Leertaste. Der Skelett Code wird eingefügt:
versuchen Sie
|
Schließlich
|
Ende ;
Der Cursor wird an der entsprechenden Stelle in der Klausel versuchen befinden. Drücken Sie nachdem Sie den Code in der Klausel versuchen haben einmal in den finally -Klausel zu springen. Dann erstellen Sie Ihren Bereinigungscode.
die Trycf Vorlage behandelt eine besonders häufige Verwendung der -try... Schließlich in Delphi zu konstruieren. Dies ist die dynamische Erstellung und Zerstörung von Objekten. Schlechtes Beispiel:
MyStrings : = TStringList. Erstellen von;
MyStrings. Add('Hello');
MyStrings. Add('World');
MyStrings. SaveToFile()'hello.txt');
MyStrings. Kostenlose;
Dies ist ähnlich wie im ersten Beispiel. Eine Ressource (Speicher) ist reserviert wird - in diesem Fall durch einen Konstruktor. Die Ressource ist manipuliert, dann die Resoruce durch die aufrufende MyStrings.Free aufgehoben wird. Wenn wir MyStrings.Free nicht aufgerufen haben, die Erinnerung würde nicht aufgehoben und wir würde noch eine weitere Ressource Leck betrachten. Auch hier ist das Problem das gleiche. Wenn etwas schief beim Bearbeiten von Speicher geht, der Destruktor nicht aufgerufen, und der Speicher nie aufgehoben wird. Hier ist der entsprechende Code:
MyStrings : = TStringList. Erstellen von;
versuchen Sie
MyStrings. Add('Hello');
MyStrings. Add('World');
MyStrings. SaveToFile()'hello.txt');
Schließlich
MyStrings. Kostenlose;
end ;
Beachten Sie, dass MyStrings.Free verschoben wurde in den finally -Klausel, um sicherzustellen, dass egal was in der Klausel versuchen passiert , das Objekt freigegeben wird. Die Castalia Trycf Vorlage bietet ein Skelett für dieses Konstrukt. Um die Trycf-Vorlage verwenden, geben Sie 'Trycf' im Editor, und drücken Sie die Leertaste. Der Skelett Code wird eingefügt:
| := | . Erstellen von;
versuchen Sie
|
Schließlich
| . Kostenlose;
end ;
Der Cursor wird gefunden werden wo die erste | Charakter ist, und drücken springt jedem | in Ordnung. (Die | Zeichen erscheint nicht im Code, sondern dienen der Absicherung Klarheit hier). Verwenden Sie die Trycf -Vorlage, wenn Sie Objekte dynamisch erstellen.
Sie erfahren mehr über Castalias Code-Vorlagen hier.
Die Umgestaltung
Code-Vorlagen sind nützlich, wenn wir neuen Code schreiben, aber nicht sehr viel wenn wir vorhandenen Code gemäß unserer neuen Verständnis try ändern helfen... Schließlich. Castalia des Refactorings wird dabei behilflich sein. Die Umgestaltung der 'Surround mit...' können Sie wählen einen Codeblock und legen einen Versuch... Schließlich Block um es mit nur wenigen Mausklicks. Wählen Sie den Code, der in der Klausel versuchen geht einfach und klicken sie mit der rechten Maustaste. Im Menü 'Refactoring' wählen Sie 'Surround mit...' und schließlich 'versuchen... endlich.' Code wird sofort eingezogen und eingeschlossen in einen richtigen ... Schließlich Block.
Erfahren Sie mehr über die Castalia Umgestaltung Ausstattung hier automatisiert.
Diese Woche haben wir gelernt, wie mithilfe von Delphi versuchen... Schließlich Konstrukt Ressourcenverluste und andere Fluss Steuerelement Probleme zu vermeiden. Wir haben auch gelernt, wie Castalia hilft uns, dieses Konstrukt effektiver mit neuen Code und vorhandenen Code zu verwenden. Nächste Woche betrachten wir versuchen... außer und lernen Sie, wie Castalia uns bessere Ausnahmebehandlungscode schreiben.