AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Delphi 2006 - Fehlerbehandlung - Event?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 2006 - Fehlerbehandlung - Event?

Ein Thema von LoewenZahn · begonnen am 19. Mär 2014 · letzter Beitrag vom 20. Mär 2014
Antwort Antwort
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Delphi 2006 - Fehlerbehandlung - Event?

  Alt 19. Mär 2014, 09:52
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.
Tim
Passwörter sind wie Unterwäsche. Du darfst sie keinen sehen lassen, musst sie regelmäßig wechseln und solltest sie nicht mit Fremden tauschen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 19. Mär 2014, 10:18
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)
$2B or not $2B

Geändert von himitsu (19. Mär 2014 um 10:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 19. Mär 2014, 15:57
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ß
Tim
Passwörter sind wie Unterwäsche. Du darfst sie keinen sehen lassen, musst sie regelmäßig wechseln und solltest sie nicht mit Fremden tauschen.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 19. Mär 2014, 16:03
Ich glaube Du musst noch angeben, das die Exception behandelt wurde (im Eventhandler)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 19. Mär 2014, 16:21
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 20. Mär 2014, 09:37
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!
Tim
Passwörter sind wie Unterwäsche. Du darfst sie keinen sehen lassen, musst sie regelmäßig wechseln und solltest sie nicht mit Fremden tauschen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 20. Mär 2014, 10:01
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 20. Mär 2014, 11:17
Hallo Jaenicke.

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ß
Tim
Passwörter sind wie Unterwäsche. Du darfst sie keinen sehen lassen, musst sie regelmäßig wechseln und solltest sie nicht mit Fremden tauschen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi 2006 - Fehlerbehandlung - Event?

  Alt 20. Mär 2014, 16:24
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 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