Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi 2006 - Fehlerbehandlung - Event? (https://www.delphipraxis.net/179601-delphi-2006-fehlerbehandlung-event.html)

LoewenZahn 19. Mär 2014 08:52

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.

himitsu 19. Mär 2014 09:18

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)

LoewenZahn 19. Mär 2014 14:57

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ß

Furtbichler 19. Mär 2014 15:03

AW: Delphi 2006 - Fehlerbehandlung - Event?
 
Ich glaube Du musst noch angeben, das die Exception behandelt wurde (im Eventhandler)

himitsu 19. Mär 2014 15:21

AW: Delphi 2006 - Fehlerbehandlung - Event?
 
Zitat:

Delphi-Quellcode:
procedure TApplication.HandleException(Sender: TObject);
var
  O: TObject;
begin
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
  O := ExceptObject;
  if IsClass(O, Exception) then
  begin
    if not IsClass(O, EAbort) then
      if Assigned(FOnException) then
        FOnException(Sender, Exception(O))
      else
        ShowException(Exception(O));
  end else
    SysUtils.ShowException(O, ExceptAddr);
end;

Eigentlich muß man da nichts machen.
Wenn etwas an OnException hängt, dann wird Dieses aufgerufen und ansonsten ShowException.
Und TApplicationEvents sollte sich direkt an Application.OnException hängen. :gruebel:

LoewenZahn 20. Mär 2014 08:37

AW: Delphi 2006 - Fehlerbehandlung - Event?
 
Hallo,

leider scheint dies, zumindest in meinem Borland 2006 nicht zu funktionieren:

Delphi-Quellcode:
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;
Und hier das OnException:

Delphi-Quellcode:
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;
Ist ja auch halb so wild wenn ich es über die Einstellungen/Obtionen von Borland mache. Aber wohl ist mir dabei nicht :?

Gruß und danke für die bisherige Hilfestellung!

jaenicke 20. Mär 2014 09:01

AW: Delphi 2006 - Fehlerbehandlung - Event?
 
Zitat:

Zitat von LoewenZahn (Beitrag 1252560)
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.

Delphi selbst zeigt dir, wenn du das Programm darüber im Debugger startest, die Exception an, auch wenn sie im Programm behandelt würde. Denn du möchtest das Programm doch gerade debuggen, und deshalb möchtest du doch die Fehler gerade erkennen.

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.

LoewenZahn 20. Mär 2014 10:17

AW: Delphi 2006 - Fehlerbehandlung - Event?
 
Hallo Jaenicke.

Zitat:

Zitat von jaenicke (Beitrag 1252686)
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.

Ich bekomme das Problem/den Fehler während des laufenden Betriebes und möchte dort die Standardmeldung abfangen. Es ist nicht so, dass ich einen gewissen Fehler habe, dessen Ausgabe ich verhindern möchte. Vielmehr ist es so wie du sagst, dass ich einen unerwarteten Fehler abfangen und dokumentieren möchte.

Gruß

himitsu 20. Mär 2014 15:24

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;
reinmachen, ber ich weiß nicht wie es an dieser Stelle reagiert.

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 18:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz