Angenommen, ich habe die folgende Routine:
%Vor% Was bedeutet die Umsetzung von except
und finally
? Ich habe viele Beiträge mit ihnen in beiden Richtungen gesehen, aber ich habe keine klare Erklärung davon gesehen, was in welchen Fällen angemessen ist (ich denke immer noch, es ist seltsam, dass in dem obigen Konstrukt der finally
Block ausführt nach der except
-Block!).
Ich habe auch Beiträge gesehen, die darauf hindeuten, dass das Mischen von try..except
und try..finally
keine gute Idee ist. Wie können Sie es in Situationen vermeiden, in denen eine Routine eine Ausnahme als Teil der normalen Operation auslöst - wie in einigen der Indy-Routinen?
Es gibt keinen einzigen richtigen Weg, dies zu schreiben. Die zwei Varianten machen verschiedene Dinge. Vielleicht bevorzugen Sie eine Version in einem Szenario, die andere in einem anderen Szenario.
Version 1, endlich innerlich
%Vor%Version 2, schließlich äußerste
%Vor% Der große Unterschied ist, wie sich der Code verhält, wenn TFileStream.Create
eine Ausnahme auslöst, eine alles andere als unplausible Eventualität. In Version 1 wird die Ausnahme innerhalb von ReadFile
abgefangen und bearbeitet. In Version 2 wird die Ausnahme von ReadFile
und in der Kette der Ausnahmebehandler weitergegeben.
Weitere
Sie sagen:
Ich denke immer noch, dass es seltsam ist, dass der finally-Block im obigen Konstrukt nach dem except-Block ausgeführt wird!
Das gilt nicht für den Code in Ihrer Frage, Version 1 oben. Vielleicht verstehst du noch nicht ganz, wie endlich und Blöcke funktionieren.
Ein häufiger Fehler, der häufig beobachtet wird, ist der Wunsch, Ausnahmen so schnell wie möglich zu erfassen und zu behandeln. Das ist die falsche Strategie. Der ganze Punkt über eine Ausnahme ist, dass es nicht passieren soll und Sie normalerweise nicht wissen, was zu tun ist, wenn es passiert. Ihr Ziel ist es, Ausnahmen so spät wie möglich zu behandeln. Für die überwiegende Mehrheit des Codes sollten Sie Ausnahmen nicht behandeln. Lassen Sie sie bis zu einem Punkt im Code hochfliegen, der mit dem Fehler umgehen kann.
Tags und Links exception-handling delphi try-except try-finally