Home » Tutorials » Object Pascal/RTL » Delphi-Crashkurs

Delphi-Crashkurs

Exceptions

Eine Exception (zu Deutsch „Ausnahme„) tritt dann auf, wenn ein unerwarteter Fehler im Programm auftritt. Unerwartet heißt hierbei, dass z.B. nicht geprüft wurde, ob eine Variable Null ist und bei einer Divison durch diese Variable ein Fehler eintritt, nämlich die nicht definierte Division durch Null.
Eine solche Exception würde, wenn man nichts dagegen täte, dem Nutzer als Fehlermeldung entgegen springen und das ist etwas, das man auf jeden Fall vermeiden sollte. Nichts verunsichert einen Nutzer mehr. 😉 Das Prinzip von try-except und try-finally wird oft auch als „Structured Exception Handling“ (SEH) bezeichnet.

try-except

Man vermeidet solche Ausnahmen, indem man sie behandelt, wenn sie auftreten. Bitte schalten Sie für das nachfolgende Beispiel die Option „Bei Delphi-Exceptions stoppen“ unter „Tools -> Debugger-Optionen -> Sprach-Exceptions“ aus. Ansonsten würden Sie als Programmierer auch behandelte (und für den Endnutzer abgewendete) Exceptions sehen.

var a, b: Integer;
    c : Double;
begin
  a := 5;
  b := 0;
  c := a / b;
  ShowMessage(FloatToStr(c));
end;

Sobald Sie diesen Code ausführen, wird Ihnen die Meldung „Gleitkommadivision durch Null“ entgegen springen. Eine solche Meldung sollte natürlich den Nutzer nie erreichen, sondern im Programm verarbeitet werden.

 try
    c := a / b;
  except
    exit;
  end;

Die Syntax ist ganz einfach: Eingeleitet wird die so genannte „try-except-Anweisung“ durch das Schlüsselwort „try„. Dieses wird gefolgt von den Befehlen, welche ausgeführt werden sollen und dabei eventuell einen Fehler produzieren. Sie müssen übrigens nicht in „begin“ und „end“ verpackt werden.
Anschließend folgt das Schlüsselwort „except„. An dieses Schlüsselwort schließt sich der Block von Befehlen an, der ausgeführt wird, sobald eine Exception auftritt, auch die „Ausnahmebehandlung“ genannt. In einem richtigen Programm sollten hier Befehle stehen, welche den korrekten Ablauf des Programmes trotz des Fehlers garantieren. In diesem Fall wird die Prozedur einfach verlassen.
Es ist auch möglich, gezielt auf bestimmte Arten von Exceptions zu reagieren. Das geht so:

 try
    c := a / b;
  except
    on EZeroDivide do c := 0;
    on EOverflow do c := 1000000;
  else
    exit;
  end;

Hier wird bei einer Division durch Null das Ergebnis auf Null gesetzt, bei einem Überlauf (also wenn die Zahlen für den Datentyp „double“ zu groß werden), wird das Ergebnis auf eine Million gesetzt. Bei allen anderen Fehlern wird die Prozedur beendet.

try-finally

Eine try-finally-Anweisung wird dann verwendet, wenn es Code gibt, der auf jeden Fall (also bei einem normalen Programmablauf und bei einer Exception) ausgeführt werden soll. Dies ist inbesondere dann der Fall, wenn man mit Objekten arbeitet, da diese freigegeben werden sollten, komme was da wolle. Daher nennt man eine try-finally-Anweisung der folgenden Art auch einen „Speicherschutzblock„:

 myStringList := TStringList.Create;
  try
    macheWas(myStringList);
  finally
    myStringList.Free;
  end;

Hier wird zuerst einmal eine Stringlist erstellt (zur Verwendung dieser bitte die Delphi-Hilfe bemühen). Im try-Abschnitt wird dann einiges damit gemacht. Und egal ob in diesem Teil ein Fehler auftritt oder nicht, muss der Speicher, welche die Stringliste belegt, auch wieder freigegeben werden. Dies wird im finally-Abschnitt erledigt.

Wichtig: Sie sollten bei der Arbeit mit Objekten immer an den Speicherschutzblock denken!

2 Gedanken zu „Delphi-Crashkurs“

  1. Guten Morgen,

    erst einmal vielen Dank für die ausführlichen Erklärungen!

    Im ersten Beispiel zur Darstellung von Zahlen im Rechner müsste es heißen

    4 mal 1 = 4*10^0

    statt

    4 mal 1    = 4*10

     

    1. Vielen Dank für den Hinweis.
      Ich habe es entsprechend korrigiert.
      Auch Deinen weiteren Hinweis habe ich eingearbeiotet.

Kommentare sind geschlossen.