![]() |
Delphi 2006 - Fehlerbehandlung - Event?
Grüße,
als Anfänger hoffe ich eine einfache und leichte Möglichkeit zu finden, eventuelle Fehler zu behandeln. Ich arbeite an einem recht großen Programm mit ca 40 Forms das prinzipiell nur mit Daten aus einer Datenbank jongliert. Nun kann es im absoluten Ausnahmefall vorkommen das ein Datensatz fehlerhaft ist und nicht bearbeitet werden kann. In diesem Fall, gibt es dann ja eine Fehlernachricht von Delphi, mit der ein normaler Nutzer nichts anfangen kann. Ich weiß dass es try-Except-finally gibt, aber ich kann dies doch nicht jedes mal anwenden wenn ich mit einem Datensatz auch nur ansatzweise hantieren will. Gibt es in Delphi ein Event, wo alle vorkommenden Fehler behandelt werden? Klingt bestimmt nach Wunschdenken, aber wenn eine Fehlernachricht dargestellt wird, wäre es sehr angenehm für mich einen alternativen Dialog anzuzeigen, wo der Fehler an den Support gesendet werden kann. Freue mich auf eine Belehrung. Gruß L. |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Application.OnError oder besser TApplicationEvents.OnError,
das fängt alles ab, was in der VCL-MessageLoop landet. (also kurz bevor die Exception-Meldung angezeigt wird, welche man darüber z.B. ersetzen kann) Und natürlich sollte man mal die Exceptions mal auswerten, welche im TThread.Execute durchrauschen, denn die verschwinden normaler Weise im Nirvana. TThread.OnTerminate und dort das TThread.FatalException (ist eine Exception) auswerten. Exceptions im Synchronize werden vom Hauptthread an den aufrufenen Thread durchgereicht und dort erneut ausgelöst. In WinAPI-Threads, ohne die RTL drumrum, auch in HauptThread ohne die VCL drumrum (drum hat in halbwegs aktuellen Delphis die Konsolenanwendung-Vorlage ein Try-Except schon eingebaut) Und warum Delphi die Exceptions abfängt: Windows schießt die komplette Anwendung ohne Fehlemeldung radikal ab, wenn Exceptions unbehandelt bis zum Windows (dahin, wo der Thread gestartet wurde) durchrauschen. (nur ein Logeintrag in der ereignisanzeige) Oder man wendet sich direkt an die Exceptionbehandlung. Oder man verwendet ein Exceptionsbehandlungstool (z.B. EurekaLog) Die übernehmen, wen es eingestellt ist, auch das Loggen des (unbehandelten) Fehler oder gar aller Fehler (auch der via Try-Except abgefangenen) und der kann die Logmeldung auch verschicken (z.B. via eMail) |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Hallo Himitsu.
Danke für deine Hilfestellung. Ich habe jetzt die TApplicationEvents verwendet und mir dort eine Schicke Ausgabe erarbeitet. Trotzdem erscheint noch die Standardnachricht von Delphi über das Problem. Ich hab erfahren, dass ich über die Optionen der IDE diese Ausgabe deaktivieren kann. Meine Frage ist: Kann ich diese auch via Code deaktivieren? Gruß |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Ich glaube Du musst noch angeben, das die Exception behandelt wurde (im Eventhandler)
|
AW: Delphi 2006 - Fehlerbehandlung - Event?
Zitat:
Wenn etwas an OnException hängt, dann wird Dieses aufgerufen und ansonsten ShowException. Und TApplicationEvents sollte sich direkt an Application.OnException hängen. :gruebel: |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Hallo,
leider scheint dies, zumindest in meinem Borland 2006 nicht zu funktionieren:
Delphi-Quellcode:
Und hier das OnException:
procedure TApplication.HandleException(Sender: TObject);
begin if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0); if IsClass(ExceptObject, Exception) then begin if not IsClass(ExceptObject, EAbort) then if Assigned(FOnException) then FOnException(Sender, Exception(ExceptObject)) else ShowException(Exception(ExceptObject)); end else SysUtils.ShowException(ExceptObject, ExceptAddr); end;
Delphi-Quellcode:
Ist ja auch halb so wild wenn ich es über die Einstellungen/Obtionen von Borland mache. Aber wohl ist mir dabei nicht :?
procedure TFormMain.ApplicationEvents1Exception(Sender: TObject; E: Exception);
Var F : textFile; begin //Ausgabe des Fehlers in einem TAdvSmoothMessageDialog: md.HTMLText.Text := 'Es ist ein Schwerwiegender Fehler augetreten:<br/><br/><ul><li>' +E.Message +'</li></ul><br/><br/>Bitte kontaktieren Sie den Support.'; md.Caption := 'Schwerwiegender Fehler'; md.Execute; //Speichern des Errors in einer Textdatei: AssignFile(F,Dir_StartDir+'errorlog\'+loginname+'.log'); If Not FileExists(Dir_StartDir+'errorlog\'+loginname+'.log') Then Rewrite(F) Else Append(F); Writeln(F,DateTimetostr(Now)+': '+E.Message+' | ActiveWindow: '+recent_visited_form.text); CloseFile(F); end; Gruß und danke für die bisherige Hilfestellung! |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Zitat:
Was ich nicht verstehe: Wenn du das Problem im Debugger bekommst, warum behebst du es dann nicht dort auch? Das ganze Exception-Handling ist doch hauptsächlich dafür da, dass man einen Fehler abfängt und sauber loggt, den man im Test so nicht bekommt und daher nicht beheben kann. |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Hallo Jaenicke.
Zitat:
Gruß |
AW: Delphi 2006 - Fehlerbehandlung - Event?
Das OnException-Event wird noch vor dem Delphi-Exception-Dialog angeziegt?
Man könnte versuchen nach seiner Behandlung ein Zitat:
Abort löst eine "stille" Exception aus (Diese werden standardmäßig nicht angeweigt), überspringt damit alle nachfolgenden Programmcodes, aber wenn diese Exception nicht abgefangen wird und bis zum Windows durchrauscht, dann könnte das Programm abkratzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz