Home » Tutorials » Object Pascal/RTL » Exceptions

Exceptions

Globales Exceptionhandling

Will man für seine Anwendung komplett alle Exceptions abfangen und in eigenen Meldungsfenstern präsentieren, kommt man mit try und except natürlich nicht weit. Dafür gibt es die Möglichkeit, Exceptions global abzufangen.
Dafür muss im OnCreate-Ereignis des Hauptfensters Folgendes eingefügt werden:

procedure TForm1.FormCreate(Sender: TObject);
  ...
  Application.OnException := AppException;
  ...
end;

AppException stellt den Namen der selbstdefinierten Methode dar, in der dann eine eigene Fehlermeldung erzeugt werden kann, z. B.:

procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  if Sender is TComponent then
    MessageDlg(Format('Es ist folgender Fehler aufgetreten:%s%s%s'+
    'Fehlertyp:%s%s%sSender:%s%s [%s]', [#10#13, E.Message,
    #13#10#13#10, #10#13, E.ClassName, #10#13#10#13, #13#10,
    TComponent(Sender).Name, Sender.ClassName]), mtError, [mbOk], 0)
  else
    MessageDlg(Format('Es ist folgender Fehler aufgetreten:%s%s%s'+
    'Fehlertyp:%s%s%sSender:%s%s', [#10#13, E.Message, #13#10#13#10,
    #10#13, E.ClassName, #10#13#10#13, #13#10, Sender.ClassName]),
    mtError, [mbOk], 0);
end;

Von nun an werden alle Exceptions von dieser Methode aufgefangen, die nicht in einem try-except-Block abgefangen werden.
Die AppException-Methode mag auf den ersten Blick etwas unübersichtlich wirken. Das liegt an der häufigen Verwendung von #10#13, dem Zeichen für einen Zeilenumbruch unter Windows. Dadurch erreichen wir, dass der Ausgabedialog übersichtlicher gegliedert ist. In ihm geben wir genauere Daten zur Exception aus, z.B. die Standardbeschreibung (E.Message), die Art der Exception (E.ClassName) und das auslösende Objekt (Sender.ClassName).