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).