try - finally ist dazu da, Resourcen abzusichen, um zu verhindern, dass ein Objekt, das vor try erzeugt worden ist, nicht mehr freigegeben wird, weil es im try-finally Block zu einer Exception gekommen ist. Bei diesem Code
Code: Alles auswählen
var
bmp: TBitmap;
begin
bmp := TBitmap.Create;
bmp.LoadFromFile(BITMAP_DATEI);
Image.Picture.Assign(bmp);
bmp.Free;
end;
wird das Bitmap nicht mehr freigegeben, wenn z.B. die BITMAP_DATEI nicht gelesen werden kann. Als Folge hat das Programm ein Speicherleck. Mit einem try-finally Block lässt sich das verhindern, weil der Teil in finally immer ausgeführt wird (auch wenn z.b. mit "exit" die Prozedur verlassen wird). Daher ist try-finally extrem wichtig
Code: Alles auswählen
var
bmp: TBitmap;
begin
bmp := TBitmap.Create;
try
if not FileExists(BITMAP_DATEI) then
exit;
bmp.LoadfromFile(BITMAP_DATEI);
Image.Picture.Assign(bmp);
finally
bmp.Free; // Das wird ausgeführt, wenn die Datei nicht existiert oder das falsche Format hat oder was auch immer
end;
end;
try-except, dagegen, ist dazu da, das Verhalten bei einer Exception zu ändern. Du willst in deinem Programm gar nicht das Fehler-Fenster sehen, sondern eine Meldung in einem Memo hinterlassen. Das kannst du mit dem weiter oben gezeigten Code erreichen.
Mit raise im except Block kannst du die Exception nochmals auslösen, damit sie im Aufruf-Stack höher gereicht wird und von einem evtl. weiteren try-except/finally Block erneut behandelt wird. Das würde ich in deinem Fall nicht machen.
Dass ich anfangs, von Turbo Pascal kommend, von Exceptions zur Fehler-Detektion (try-except) begeistert war, ist inzwischen verflogen, und ich versuche Exceptions so weit wie möglich zu vermeiden, indem ich die naheliegenden Fehlerursachen abfrage. Wenn darüber hinaus weitere Exceptions auftreten, muss ich mich darum mit try-except nicht kümmern, sie bekommen halt die Standard-Behandlung. (Natürlich muss aber ein try-finally Block vorhanden sein, falls irgendwas wieder auf den Ausgangszustand zurückzustellen ist). Was mich an Exceptions stört, ist dass die IDE bei einer Exception immer anhält, obwohl sie mit try-except behandelt worden ist (das gewünschte Verhalten hat man erst zur Laufzeit außerhalb der IDE). Man kann zwar die IDE anweisen, einen bestimmten Exception-Typ zu ignorieren, aber das trifft dann nicht nur auf diesen einen Fall zu. Glaub mir, es ist ganz schön nervig, wenn du unter den 2500 Records Exceptions auch von nur 100 doppelten Einträgen wegklicken musst.
In deinem fall würde ich vor dem Post suchen, ob der Record mit dem aktuellen Primary Key schon in der Datenbank vorhanden ist, mit entsprechenden Indices geht das ruck-zuck. Nur wenn das nicht der Fall ist, kann geschrieben werden, ansonsten: Memo1.Lines.Add('Record mit Primary Key = ' + ... + ' schon vorhanden.');