Exceptions fangen und weiterwerfen Ressourcenschutzblöcke: try

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