Qrealm.com


Mit try..except zur Fehlerbehandlung

Erfahren Sie mehr über Ausnahmen und wie man bessere Fehlerbehandlung Code zu schreiben. Erfahren Sie, wie Castalia kann uns helfen, schreiben robuster und fehlertolerant Code.

(Ursprünglich bei delphi-expert.com am 23. März 2004 veröffentlicht)

Wie versprochen, ist heute Teil zwei unserer Diskussion über Delphis Versuch Konstrukte. In der vergangenen Woche haben wir uns try..finally, gelernt, was es ist, die, wenn es zu benutzen soll und wie Castalia kann uns helfen, besser zu nutzen. Diese Woche werden wir die andere Hälfte der Versuch der Familie, try..except untersuchen und lernen, wie Castalia können unsere try..except Nutzung effektiver zu gestalten. Wir werden auch lustig machen java.

Try..except ist ein Konstrukt für den Umgang mit "außergewöhnlichen" Situationen in einem Programm. Ein Programm hat eine typische Strom, der eine Reihe von Anweisungen, um fortzufahren ist. Manchmal wird dieser Auftrag umfasst Niederlassungen, aber es gibt immer einen logischen Ablauf und Entscheidungen zu Zweig, fließen, werden auf einem Zustand des Programms auf der Grundlage, wie, ob X kleiner als 5.

Manchmal jedoch, dass Staat kann falsch gemacht werden. Nehmen wir ein Beispiel, damit wir in der realen Welt zu sehen:

Assign (F, 'somefile.txt');

ResetFile (F);

S: = ReadLn (F);

Close (F);

Dieser einfache Code wird eine Datei zu öffnen, lesen Sie eine Zeile aus, und schließen Sie sie wieder. Dies ist der normale Ablauf des Programms. Es gibt jedoch eine Reihe von Annahmen über diesem Strömungs hergestellt. Zunächst nehmen wir an, dass die Datei existiert. Wir gehen davon aus, dass wir es zum Lesen zu öffnen. Wir nehmen an, dass es eine Zeile gelesen werden sollen. Etc ...

Wenn eine dieser Annahmen als falsch heraus sein, dann haben wir eine außergewöhnliche Lage! Der Ablauf des Programms wird durch die Tatsache, dass einige Zustand nicht der Zustand, den wir erwartet, verwirrt zu werden.

Es gibt mehrere Möglichkeiten, diese Ausnahmesituationen behandeln. Wir könnten sie zu ignorieren, und wenn einer von ihnen kommt, wird das Programm zum Absturz bringen oder etwas anderes ebenso unberechenbar. Wir konnten für diese Ausnahmen zu prüfen, Hinzufügen von Code wie folgt aus:

wenn nicht FileExists ("somefile.txt ') dann

start

WriteLn ('Datei ist nicht vorhanden ");

Ausgang;

ende;

Dies ist besser. Für eine Sache, die Sie tatsächlich sagen können, den Benutzer, warum das Programm nicht funktionieren. Für einfache Programme, das funktioniert gut, aber das Programm wird immer komplexer, wird der Status des Programms exponentiell komplexer geworden, und bald werden Sie nicht in der Lage, alle Annahmen zu überprüfen. Überprüfen Sie Ihre Annahmen ist eine gute Sache aber. Wir werden später darauf zurückkommen.

Wir können auch checkafter jede Operation, um sicherzustellen, dass das, was wir erwartet, dass passieren. Dies ist die traditionelle C-Ansatz und der Ansatz der Windows-API (und die meisten anderen Betriebssystem-APIs, mit BeOS als eine bemerkenswerte Ausnahme). In diesem Modell ist, gibt jede Funktion einen Fehlercode. Sie sind dafür verantwortlich, den Fehlercode überprüfen und sehen, wenn es sich um "OK" oder etwas anderes wie FILE_NOT_FOUND. Dann noch einmal, Sie den Benutzer und Ausgang informieren würde.

Dies wird, am Ende, eine Veränderung auf dem gleichen Ansatz, nur dieses Mal werden wir die Überprüfung der Annahmen, nachdem wir etwas tun, anstatt vor. Der Vorteil ist, dass das jede Funktion kann eine eigene Annahmen zu überprüfen und im Falle der Windows-API werden alle möglichen Rückgabewerte recht gut dokumentiert, so mit disziplinierter schriftlich, ist es tatsächlich möglich, jede Bedingung zu behandeln, vorausgesetzt, daß, wer schrieb die API nahm alle seine Annahmen berücksichtigt. Code mit dieser Methode geschrieben wäre in etwa so (Nein, das ist nicht gültig pascal, meine Entschuldigung an die Puristen) aussehen:

ErrCode: = Assign (F, 'somefile.txt');

wenn ErrCode = FILE_NOT_FOUND dann

start

WriteLn ('Datei nicht gefunden ");

Ausgang;

ende;

ErrCode: = ResetFile (F);

wenn ErrCode = FILE_NO_ACCESS dann

start

WriteLn ('Du don''t Zugriff auf das zu tun.');

Ausgang;

end else

wenn ErrCode = FILE_ALREADY_OPEN dann

start

WriteLn ('Jemand anderes wird das Lesen der Datei');

Ausgang;

ende;

ErrCode: = ReadLn (F, S); // Annahme dieses Mittel von F in S lesen

wenn ErrCode = NOT_ENOUGH_TEXT dann

start

WriteLn ('Nicht genügend Text');

Ausgang;

ende;

Close (F);

Sie erhalten die Idee. Es hätte viel schlimmer sein, aber unser Programm wirklich komplex geworden ist wirklich schnell, und alle die Dinge, die normalerweise nicht passieren, unterzubringen.

Also, jemand in den letzten Jahrzehnten eine neue Idee. Warum nicht eine Kontrollstruktur speziell zu schaffen für Ausnahmesituationen? Diese neue Struktur könnte kontrollieren würde uns erlauben, zu definieren, was normalerweise passiert, und dann festlegen, was passieren soll, wenn etwas schief geht. Dies ist bekannt als "Ausnahmebehandlung."

Der Grundgedanke der Ausnahme ist, daß man annimmt, daß die Normalflusskontrolle stattfinden wird. Wenn nicht, werden wir sofort zu stoppen Ausführung wo immer wir sind, und beenden die aktuelle Funktion. Wir verlassen dann die Funktion, die diese Funktion aufgerufen, und so weiter, bis eine Ausnahme-Handler, der ein Codeblock, der ausgeführt wird, nur dann, wenn ein Ausnahmezustand oder eine Veranstaltung stattfindet, erreichen wir. Wenn der normale Ablauf der Ausführung gefolgt wird, werden Exception-Handler ignoriert.

In Delphi ist der normale Ablauf der Ausführung in einem try-Block, und die Ausnahmebehandlung in eine except-Block. Hier ist ein einfaches Beispiel:

versuchen

Assign (F, 'somefile.txt');

ResetFile (F);

S: = Readln (F);

Close (F);

außer

WriteLn ('ist ein Fehler aufgetreten');

ende;

Das ist sauberer, und es erlaubt uns, klar zu sehen, was wir erwarten, dass Code in der Regel durchgeführt werden und welche Code ausgeführt werden sollte, wenn etwas Seltsames passiert (nicht wie dieses letzte Beispiel ... Schauder).

Natürlich wäre es schön, in der Lage sein, um den Benutzer genau das, was Fehler aufgetreten erzählen. Die Ausnahmebehandlung ist dies ein Kinderspiel zu. Da die Ausnahmebehandlung entwickelt Hand in Hand mit der objektorientierten Programmierung, wurden Dinge genannt Ausnahmeobjekte konzipiert. Das Ausnahmeobjekt wird automatisch erstellt, wenn eine Exception ausgelöst. Wenn wir die Ausnahmeobjekt verwenden möchten, wir verlängern die try..except Syntax wie folgt aus:

versuchen

Assign (F, 'somefile.txt');

ResetFile (F);

S: = Readln (F);

Close (F);

außer

auf E: Ausnahme zu tun

WriteLn (E.Message);

ende;

Sie sehen, jede Ausnahme hat eine Message-Eigenschaft, die etwas kurze nützliche Informationen über die spezifische Ausnahme gibt. Es könnte die Zeichenkette "Datei nicht gefunden" oder "Datei bereits in Verwendung", oder etwas anderes, wir möchten dem Benutzer, zu erzählen.

Es gibt verschiedene Arten von Ausnahmen, und wir können die Vorteile, dass zu nehmen. Vielleicht wollen wir etwas Besonderes tun, wenn eine bestimmte Ausnahme passiert. Vielleicht wollen wir zu piepen, wenn die Datei nicht gefunden wird:

versuchen

Assign (F, 'somefile.txt');

ResetFile (F);

S: = ReadLn (F);

Close (F);

außer

auf E: FileNotFound tun

Beep;

auf E: Ausnahme zu tun

WriteLn (E.Message);

ende;

Beachten Sie, dass, wenn wir mit mehreren Ausnahmen, die spezifische Ausnahme muss zuerst gehen. Dies liegt daran, Ausnahmen sind polymorph - das heißt, Ausnahme ist JEDER Ausnahme, und EFileNotFound ist eine Ausnahme, so dass, wenn Exception wird zuerst behandelt werden EFileNotFound nie behandelt werden.

Ein Problem bei diesem Mechanismus ist, dass wir immer noch nicht sicher, welche Ausnahmen eine bestimmte Funktion oder Prozedur könnte zu erhöhen. Einige Sprachen oder Entwicklungswerkzeuge haben einen Mechanismus, damit Sie wissen, was könnte angehoben werden. Eine C # IDE, zum Beispiel, wird Ihnen eine kleine Hinweisfenster, um Ihnen zu sagen, welche Ausnahmen sollten Sie behandeln, wenn Sie eine Funktion verwenden. Java ist berüchtigt (und gehasst von vielen) für die Tatsache, dass es Ausnahmebehandlung mit terroristischen Eifer erzwingt. Ihr Code wird nicht einmal kompilieren, wenn Sie nicht behandeln die Ausnahmen, dass es Sie will, auch wenn Sie wissen, dass diese Ausnahmen nicht passieren, weil Sie die Kontrolle über die Fahrumgebung oder Ihr Code hat bereits prechecked den Zustand und die gewährleistet, dass die Ausnahme kann unmöglich geworfen werden. Java wird sein Code-Stil bis zum letzten Jota und Pünktchen durchzusetzen, ob Sie es wollen oder nicht.

Leider gibt es kein solches Werkzeug für Delphi. Während ich dies schreibe, ich beginne zu glauben, dass es eine gute Sache, um zu Castalia hinzufügen. Ich muss in diesem Blick.

Puh!

Das war dreieinhalb Seiten von Microsoft Word, genau zu verstehen, was die Ausnahme ist. Nun zum spaßigen Teil:

Castalia kann Ihnen helfen, sowohl Ihre normalen Code und Ihre Ausnahmebehandlung Code zu schreiben. Castalia der Code-Templates definieren eine trye Vorlage, die automatisch eine try..except Block für Sie und stellt Einstiegspunkte, so dass Sie richtig Code erstellen. Das spart Ihnen mehr Tastatureingaben und mehr Zeit, als Sie denken!

Castalia die Refactoring-Tools bieten eine automatische Surround mit ... Refactoring, die eine try..except Block um den Code zu setzen wird. Markieren Sie einfach den normalen Ablauf Steuercode der rechten Maustaste auf den Editor (oder drücken Sie Umschalt + Strg + R), und wählen Sie das entsprechende Element in der Refactoring-Menü. Der Code wird automatisch geändert.

In dieser Woche haben wir gelernt, was die try..except Block ist für und woher es kam (und warum es noch die beste Fehlerbehandlungsmechanismus). Wir haben auch gelernt, wie Castalia können Ihre Benutzung dieser leistungsfähigen Kontrollstruktur zu machen, mehr robuste und benutzerfreundliche Code zu schreiben.

Für weitere Informationen über Castalia der Code-Vorlagen, klicken Sie hier.

Für weitere Informationen über Castalia automatisierten Refactorings, klicken Sie hier

Um Castalia jetzt, da dieser Artikel war das Beste, was Sie jemals gelesen haben, zu kaufen, klicken Sie hier, und klicken Sie hier, um ein viel besseres Buch zu lesen.