Object Pascal im Detail - Exceptions www.delphi-treff.de
110
try ergebnis := teileZahlzahl1, zahl2;
zeigeErgebnisergebnis; except
ShowMessage Es ist ein Fehler aufgetreten?
; ergebnis :=
; end;
machWas; Was  passie t  i   diese   Beispiel?  Es  i d  e su ht,  die  Fu ktio   „teileahl   aufzu ufe .  Es  i d  da it
ge e h et, dass hie  ei e E eptio  ge o fe   i d. T itt kei e E eptio  auf,  i d „zeigeE ge is  aufge ufe und
a s hließe d „ a hWas . De  e ept-Blo k  i d ig o ie t. T itt i  „teileahl  hi gege  ei e E eptio  auf, geht  es  direkt  im  except-
Blo k  eite .  „zeigeE ge is   i d  ü e sp u ge   u d  dafü   „“ho Message aufge ufe  u d die Va ia le „e ge is  auf   gesetzt. A s hließe d geht es au h hie   it „ a hWas   eite .
Eine  Methode  oder  Funktion  kann  natürlich  auch  verschiedene  Arten  von  Exceptions  werfen.  Wenn  man unterschiedlich auf diese reagieren will, muss im except-Block der Typ geprüft werden:
try irgendeineMethode;
except on EZeroDivide do Value := MAXINT;
on EMyException do Value := ;
end;
4.10.4. Exceptions fangen und weiterwerfen
Grundsätzlich  sollte  man  Exceptions  nur  fangen,  wenn  man  auch  sinnvoll  darauf  reagieren  kann.  Wird  eine Exception nicht mittels try-except gefangen, wird sie an den Aufrufer des Aufrufers weitergegeben usw., bis die
Exception auf der obersten Ebene des Programms angekommen ist. Wenn sie auch hier nicht gefangen wird, bekommt sie der Anwender angezeigt.
Manchmal ist es sinnvoll, eine Exception zu fangen, um z.B. bestimmte Variablen zu setzen, trotzdem will man sie a  de  Auf ufe   eite e fe . Dies passie t  it de  ei fa he  Auf uf  o  „ aise :
Object Pascal im Detail - Exceptions www.delphi-treff.de
111
try machWas;
except on EMyException do
begin Setze Variablen
raise; Wirf die Exception weiter
end; end;
4.10.5. Ressourcenschutzblöcke: try
– finally
Häufig kommt  es  vor,  dass  man  Objekte  oder  Speicher freigeben  möchte,  auch  wenn  eine  Exception  auftritt. Für diesen Fall gibt es try-finally-Blöcke. Der finally-Block wird auf jeden  Fall ausgeführt, auch wenn zwischen
try und finally eine Exception geworfen wird. Falls keine Exception aufgetreten ist, wird die Ausführung direkt nach dem finally-Block fortgesetzt; ansonsten geht es mit der Exception-Behandlung in der Aufrufer-Methode
weiter. Der finally-Block selbst wird aber in jedem Fall zuerst ausgeführt: var sl: TStringList;
... sl := TStringList.Create;
try Mache irgendwas mit sl
finally sl.Free;
end; Dieses  Ko st ukt  i d  au h  „‘essou e s hutz lo k   ge a t,  eil  si he gestellt  wird,  dass  Ressourcen  im
Beispiel der für die StringList reservierte Speicher auf jeden Fall wieder freigegeben wird. Das E zeuge  de  “t i gList  z . ei es  elie ige  O jekts steht ü ige s  o  de  „t . De   e  hie  et as
schief  geht,  ist  die Va ia le  „sl   o h  ga   i ht  i itialisie t,  so  dass  sie  auch  noch  nicht  wieder  freigegeben
werden muss. Das würde vielmehr zu einem weiteren Fehler führen.
Object Pascal im Detail - Dateien www.delphi-treff.de