Es gibt "try - except - end" und "try - finally - end"
Das stimmt. Aber
try..finally
hat
nichts mit Exceptions zu tun! Das ist ein Ressourcenschutzblock und wird
immer ausgeführt, egal was zwischen
try
und
finally
passiert, auch dort auftretende Exceptions ändern daran nichts. Übliche Verwendung eines
try..finally
:
Delphi-Quellcode:
var Lobject: TObject;
begin
Lobject:= TObject.Create;
try
MachWas(Lobject);
finally
Lobject.Free;
end;
end;
Egal, was nun in MachWas passiert, das Objekt wird mit Sicherheit freigegeben.
Anders ist das bei
try..except
. Dieses Konstrukt ist zum Fangen von Exceptions da.
shmia hat dazu ein IMO wunderbares
Tutorial geschrieben, wie man mit dem Konstrukt und Exceptions an sich umgehen sollte. Wichtigster Rat daraus:
Exceptions mit eigenen, wichtigen und nützlichen Informationen anreichern, die bei der Fehlersuche und dessen Ursache(n) helfen können.
Zitat:
4)Wie sieht das aus wenn ich in OnDestroy etwas freigeben möchte aber z.B. in OnClose nichts gemacht wird. Schreibe ich jetzt "try-except-end" in ein leeres OnClose nur um sicherzugehen, dass ich das OnDestroy auch in jedem Fall erreichen kann.
Nein. Warum sollte eine leere Funktion eine
Exception werfen?
Zitat:
Kann es sein, dass verschiedene Programme oder Treiber eine
Exception verursachen während sich das Programm gerade in OnClose oder OnDeaktivate befindet.
Ja, das kann passieren, wobei das nicht auf die genannten Funktionen/Events beschränkt ist. Und "verursachen" ist der falsche Begriff, denn verursacht werden können Exceptions (AFAIK) nicht von externer Seite, nur ausgelöst durch irgendwelche Zustände, mit denen der eigene Code nicht klarkommt und dieser dann eine
Exception auslöst.
Ich hatte nun schon mehrfach den Fall, dass sich irgendein anderes auf einem fremden Rechner laufendes Programm in die Exceptionhandler-Kette reinhing, so dass mein eigener nicht auslöste. Das führte dummerweise zum Absturz meiner Software, und ich konnte noch nicht einmal diagnostizieren, wer dafür verantwortlich ist/war und wie ich es beheben sollte. Sowas ist
richtig Scheiße. Ändert aber nichts an der Wichtigkeit eigener Exceptionhandler.
Zitat:
5)Ich hab' noch nie eine Fehlermeldung vom
OS bekommen die mir tatsächlich wirklich weitergeholfen hätte
Glaub mir: Du wirst diese (vermeintlich) nichtssagenden Dinger irgendwann zu schätzen wissen, denn nur damit kann man sich auf die Suche begeben, sei es nun im eigenen Code oder im Internet. Oft ist es so, dass andere Leute bereits etwas zu einer bestimmten Meldung geschrieben haben, wodurch sie ausgelöst werden kann, und - mit etwas Glück - wie man sie vermeiden bzw. beheben kann.
Zitat:
Der Einzige, der vielleicht ein klein Wenig mit "Fehler in Adresse Blabla.. Read BlaBla"
Ja, nun, mit dieser Art von Meldungen kann ich auch nichts anfangen. Deswegen ja: Exceptions beim Auftreten mit eigenen nützlichen Infos anreichern und erneut werfen; das kann auch den Funktionsname beinhalten, so dass man genau weiß, wo man suchen muss.
Oh, jetzt hab ich so viel dazu geschrieben, dass es wohl sinnvoll wäre, meinen Beitrag (und den beantworteten) in ein neues Thema zu verschieben. Könnte man "Exceptions, die Xte" nennen
.
MfG Dalai