image2data

Der Tech-Blog

...weitermachen, wo OCR aufhört

Try-Finally-Blöcke

Jan 162015

Try-Finally-Blöcke sind eng mit Try-Except-Blöcken verwandt und werden genutzt, wenn es bei Auftreten eines vorzeitigen Abbarbeitungsabbruchs (z.B. durch Fehler) notwendig ist, Restarbeiten auszuführen, bevor die aktuelle Routine oder das Skript beendet wird. Beispiele hierfür sind das Freigeben instanziierter Objekte oder allokiertem Speicher oder das Schreiben eines Logeintrags.

try
  // ein Fehler, der innerhalb dieses Blockes ausgelöst wird, bricht die Abarbeitung des Codes 
  // sofort ab und springt zu der Codezeile hinter "finally"
finally
  // hier kann Code geschrieben werden, der die oben erwähnten Aufräumarbeiten durchführt. Die 
  // Abarbeitung wird bei der folgenden "end;"-Zeile beendet
end;

Im Folgenden ein kleines Beispiel. Die markierte Zeile wirft eine Exception, da das angegebene Dokument nicht existiert. Die Folgezeilen werden nicht mehr abgearbeitet, das Skript wird mit einem Laufzeitfehler beendet. Somit wird das instanziierte Objekt "oPage" nicht mehr freigegeben, ein Speicherleck ist die Folge:

var
  oPage: TBitmap;
 
begin
  oPage := TBitmap.Create;
 
 i2dLoadBitmap('nicht_vorhandenes_dokument.tif', 1, oPage);
 
  oPage.Free;
end.

Um das zu verhindern, würde hier ein Try-Finally-Block verwendet werden, der sicherstellt, daß das Objekt "oPage" in jedem Fall wieder freigegeben wird:

var
  oPage: TBitmap;
 
begin
  oPage := TBitmap.Create;
 
  try
    i2dLoadBitmap('nicht_vorhandenes_dokument.tif', 1, oPage);
  finally
    oPage.Free;
  end;
end.

Kritischen Skriptcode also immer in Try-Except- und/oder Try-Finally-Blöcke kapseln.

Atom

powered by Nibbleblog