Exceptions werfen Eigene Exception Exceptions fangen

Object Pascal im Detail - Exceptions www.delphi-treff.de 109

4.10. Exceptions

Bei der Programmierung kommt man immer wieder in Situationen, dass z.B. eine eigene Methode mit Parametern aufgerufen wird, die nicht sinnvoll sind. In unserem Schachbeispiel wäre das der Fall, wenn eine Figur an eine Position weit außerhalb des Schachbretts verschoben werden sollte. Andere Fälle wären z.B. das Kopieren einer Datei, die überhaupt nicht existiert oder das Dividieren durch Null. Bei all diesen Beispielen handelt es sich um Ausnahmen im Programmablauf. I de o jekto ie tie te P og a ie u g kö e sol he Aus ah e e gl. „E eptio s eha delt e de . Dazu werden von der Methode, die mitteilen möchte, dass etwas nicht nach Plan läuft, ein Exception-Objekt erzeugt und an den Aufrufer übermittelt. Dieser kann entweder damit rechnen, dass dieser Fall eintritt, und die Exception fangen – oder er wirft sie weiter an seinen eigenen Aufrufer usw. Wenn letztlich niemand die Exception fängt, wird sie dem Anwender angezeigt.

4.10.1. Exceptions werfen

Im Delphi-Sprachumfang gibt es bereits einige Exception-Klassen, die von der VCL verwendet werden, z.B. EConvertError, wenn ein Problem bei Typumwandlungen auftritt, EDivByZero, wenn durch Null geteilt wird, ERegistryException, wenn der Zugriff auf die Registry nicht wie gewünscht funktioniert. Hieran erkennt man schon die Konvention: Exception-Namen beginnen immer mit einem E. Als Entwickler sollte man jedoch eher eigene Exception-Klassen verwenden, was im folgenden Abschnitt beschrieben wird. U u i ei e Methode ei e E eptio auszulöse zu „ e fe , ko t folge de Code zu Ei satz: if zahl2 = then raise EInvalidArgument.Create zahl2 ist 0 ;

4.10.2. Eigene Exception

Natürlich muss man sich nicht auf die Exceptions beschränken, die es in der VCL bereits gibt. Man kann auch seine eigenen definieren. Dabei ist eine Exception eine ganz normale Klasse, die Exception als Oberklasse hat: type EMyException = classException;

4.10.3. Exceptions fangen

Was machen wir nun mit einer geworfenen Exception? Natürlich: fangen Dafür muss der Aufruf einer Methode, o de i isse , dass sie ei P o le e ei e ode eh e e E eptio s e fe ka , it t … except umgeben. Wird tatsächlich eine Exception geworfen, wird die Ausführung direkt im except-Block fortgesetzt. Auch, wenn innerhalb des try-Blocks noch weiterer Code gefolgt wäre. 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