Das try/finally ist eigentlich eines der wichtigsten Konstrukte und du solltest dir angewöhnene damit zu arbeiten. Deine Variante mit den vielen try/except würde zwar auch funktionieren, aber ist meiner Meinung nach viel zu kompliziert. Ausserdem ist es nicht unbedingt die fein Art da einfach alle
Exception zu "schlucken". Wie weist du denn ausserhalb deiner Routine, ob alles sauber verabreitet wurde? Wertest du da nach jedem Aufruf das Log aus? Das kann ich mir nicht vorstellen. Ich mache für solche Situationen in der Regel auch eigene Exceptions und frage die dann extern ab, damit ich weiss was da genau passiert ist und wie ich auf die jeweilige Situation reagieren muss.
OK in deinem Beispiel mit dem Button1Click Event macht das keinen Sinn, da du das nicht selber aufrufst, aber in einer Funtkion die du an verschiedenen Stellen aufrufst, ist das eine dumme Idee einfach alle Exceptions zu verschlucken.
Hier nochmal ein kleines Beispiel, wenn das Bestandteil einer Funktion wäre. Ob du das except oder das finally zu oberst hast, hängt vom jeweiligen Code ab. Du bist da eigentlich frei wie du das machst. Der Auswertung erfolgt immer vom innersten Block nach aussen. Also hier wird zuerst das Except behandelt und erst danach das Finally. In deinem Beisiel ist es umgekehrt, weil da das Finally zu innerst ist.
Delphi-Quellcode:
type
EMyNilException =
class(
Exception);
procedure DoSomething();
var
tmp: TButton;
begin
try
try
tmp :=
NIL;
if tmp =
nil then
raise EMyNilException.Create('
tmp ist NIL!');
tmp.Click;
except
on E: EMyNilException
do
begin
ShowMessage(e.
Message);
raise;
end
else
raise;
// Exception die wir nicht selber behandeln sollten erneut ausgelöst werden.
end;
ShowMessage('
2');
finally
ShowMessage('
finally');
end;
end;
begin
try
DoSoemthing;
except
on E: EMyNilException
do
ShowMessage('
Es ist eine NIL-Verletzung aufgetreten');
else
raise;
end;
end