AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit globalem Exception Handling

Ein Thema von Gravitar · begonnen am 5. Sep 2009 · letzter Beitrag vom 5. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#1

Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 13:36
Hi,

ich versuche gerade in meinem Programm ein globales Exception Handling einzuführen.

Das klappt auch schon ganz gut mit einer eigenten Exception-Behandlungs-Routine:

Delphi-Quellcode:
procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin
  MessageDlg('ERROR: ' + E.Message, mtError, [mbOK],0);
end;
und der dazugehörigen Zuordnung des Ereignisses im OnCreate-Ereignis des Hauptformulars (FrmMain):

Application.OnException := frmmain.MyExceptionHandler; Dadurch erspare ich mit die vielen Try-Except-Blöcke.

Nun aber zum Problem:

Wie kann ich nach einer Exception den Focus auf das fehlerauslösende Feld legen?

Gruß, Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 14:13
Zitat von Gravitar:
Dadurch erspare ich mit die vielen Try-Except-Blöcke.
Was soll das bringen?

Fehler sollten da behandelt werden wo sie passieren. An dieser Stelle befindet man sich im Kontext und kann eventuell den Fehler durch geeignete Massnahmen sogar noch korrigieren.

In einem globalen Exceptionhandler hast du keine Kontextinformationen (oder so gut wie keine). Daher auch deine Frage wie du den Focus auf das auslösende Feld setzen kannst. Behandelst du den Fehler z.B. im OnChange Ereignis des Feldes so hast du die genaue Information um welches Feld es sich handelte und kannst nach Fehlerbehandlung den Focus korrekt setzen.

Du kannst natürlich einen nicht unerheblichen Aufwand treiben und vor jeder Aktion Informationen über den aktuellen Kontext irgendwo speichern um diese dann im globalen Exceptionhandler zu lesen aber der Aufwand ist es nicht Wert! Du hast keine Vorteile von einem globalen Handler (höchstens um Exceptions abzufangen die irgendwie durch alle anderen Exceptionbehandlungen "durchgeschlüpft" sind)
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 14:33
Es laufen z.B. in der VCL alle Aufrufe von z.B. Ereignisprozeduren in je Try-Except-Block,

wenn du jetzt dordtdeine Procedure registrierst,
dann kannst du z.B. alle nicht abgefangenen Exceptions abfangen.

Normaler Weise würde dann das Programm anhalten, der die Standardprozedur die Exception anzeigt.
Stattdessen kannst du jetzt die Exceptions z.B. in eine LogDatei schreiben.

PS: das macht sich vorallem bei services gut, welche ja nicht sichtbar sind
oder bei Programmen, welche du weitergibst.
z.B. die Exceptiosn-Loggen und eventuell selber anzeigen ... dann kann der Endanwender dir bei Progleme diese Logdatei schicken und du hast es bei derFehlersuche einfacher.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 14:45
Trotzdem sollten Fehler dort behandelt werden wo sie auftreten. Auch dort kann man die Fehler in eine Logdatei schreiben - Dazu ist kein globaler Handler nötig. Den globalen Handler kann man höchstens dazu einsetzen um wirklich unerwartete Exceptions abzufangen, zu loggen und zu behandeln.

Ansonsten ist ein globaler Handler, vor allem wenn er nur dazu da sein soll sich die anderen try..except Blöcke zu ersparen, eine wirklich schlechte Idee.
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 15:03
Dem würde ich etwas wiedersprechen.

Die Try-Except-Blöcke könnte man schon weglassen,
aber um das Aufräumen via Try-Finally kommt man nicht herum.

Try-Except mach ich nur da, wo ich entweder einen erwarteten Fehler nachträglich anders behandeln will und die Exception sozusage behandle
(z.B. Zugriffprobleme beim Öffnen/Speichern einer Datei)
oder wo ich die Meldung der Exception etweiter/ändern möchte, um sie dann aber wieder via RAISE weiterzureichen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 15:22
Zitat von Alfi001:
Du kannst natürlich einen nicht unerheblichen Aufwand treiben und vor jeder Aktion Informationen über den aktuellen Kontext irgendwo speichern um diese dann im globalen Exceptionhandler zu lesen aber der Aufwand ist es nicht Wert! Du hast keine Vorteile von einem globalen Handler (höchstens um Exceptions abzufangen die irgendwie durch alle anderen Exceptionbehandlungen "durchgeschlüpft" sind)
Hi Alfi,

eigentlich wollte ich an der Stelle, wo der Fehler passiert lediglich das Edit-Feld des auslösenden Fehlers an eine globale Variable übergeben und dieser dann in der globalen Exception den Focus übergeben.

Also z.B. so:

Delphi-Quellcode:
MyErrorObject := EdTurnierDatum; //MyErrorObject ist vom Typ TObject
// Hier passiert jetzt eine Exception, da das Datum ungültig ist
datum := strtodate(EdTurnierDatum.text,fsDate);
In der globalen Exception-Behandlungs-Routine wollte ich dann den Focus auf das MyErrorObject legen.

Delphi-Quellcode:
procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
var err : TObject;
begin
  MessageDlg('ERROR: ' + E.Message, mtError, [mbOK],0);
  MyErrorObject.setfocus;
end;
Leider funktioniert genau das nicht. Vermutlich erlaubt Setfocus kein TObject. Aber was dann?

Den Aufwand gegenüber 30-40 Try...exception...finally...Blöcken finde ich bei dieser Methode deutlich geringer.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 15:36
Zitat:
Delphi-Quellcode:
procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
var err : TObject;
begin
  MessageDlg('ERROR: ' + E.Message, mtError, [mbOK],0);
  MyErrorObject.setfocus;
end;
Und was passiert, wenn eine Exception wo anders auftritt und MyErrorObject auf sonstwas zeigt, nur nicht auf ein passendes Objekt?

Genau, es gibt 'ne Exception in der Exceptionbehandlung und bei einer globalem Exception könnte das schnell mal in einer Endlosscheife enden

Wie schon gesagt wurde:
Exceptions möglichs lokale da behandeln, wo sie auftreten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 15:46
Zitat:
Und was passiert, wenn eine Exception wo anders auftritt und MyErrorObject auf sonstwas zeigt, nur nicht auf ein passendes Objekt?
Interessante Frage. Aber noch schöner wäre es, wenn ich erst einmal den Focus auf MyErrorObject setzen könnte. Bisher funktioniert das nämlich nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 15:52
Eigentlich brauchte man in dieser Richtung garnicht erst weiterforschen, da dieses ja definitiv kein akzeptables Vorgehen ist,

Zitat:
Leider funktioniert genau das nicht. Vermutlich erlaubt Setfocus kein TObject. Aber was dann?
aber was funktioniert nicht?
(eine genauere Fehlermeldung bitte)



PS: so als Tipp: schau mal wo SetFokus deklariert wurde ... mindestens diese Klasse müstest du definieren
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Problem mit globalem Exception Handling

  Alt 5. Sep 2009, 16:15
Zitat von Gravitar:
Also z.B. so:

Delphi-Quellcode:
MyErrorObject := EdTurnierDatum; //MyErrorObject ist vom Typ TObject
// Hier passiert jetzt eine Exception, da das Datum ungültig ist
datum := strtodate(EdTurnierDatum.text,fsDate);
Nö. Behandel die Exception da wo sie ausgelöst wird:

Delphi-Quellcode:
  try
  // Hier passiert jetzt eine Exception, da das Datum ungültig ist
  datum := strtodate(EdTurnierDatum.text,fsDate);
  except
    // normalerwesie hier mit on... auf den erwarteten Exceptiontyp testen!!
    ShowMessage('Bitte ein gültiges Datum eingeben');
    EdTurnierDatum.text := '';
    EdTurnierDatum.SetFocus;
  end;
Nochmal: der globale Exceptionhandler sollte für erwartete Fehler nicht benutzt werden. Diese Fehler sollten da behandelt werden wo sie passieren (können). An der Stelle wo es passiert hast du die volle Kontrolle über den aktuellen Kontext. Im obigen Beispiel: da weisst du genau welches Edit für den Fehler verantwortlich war, kannst eventuell einen Default-Wert in das Feld schreiben und dann den Focus korrekt setzen.
Ralf Kaiser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:38 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