Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit globalem Exception Handling (https://www.delphipraxis.net/139792-problem-mit-globalem-exception-handling.html)

Gravitar 5. Sep 2009 12:36


Problem mit globalem Exception Handling
 
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):

Delphi-Quellcode:
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

Ralf Kaiser 5. Sep 2009 13:13

Re: Problem mit globalem Exception Handling
 
Zitat:

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)

himitsu 5. Sep 2009 13:33

Re: Problem mit globalem Exception Handling
 
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.

Ralf Kaiser 5. Sep 2009 13:45

Re: Problem mit globalem Exception Handling
 
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.

himitsu 5. Sep 2009 14:03

Re: Problem mit globalem Exception Handling
 
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.

Gravitar 5. Sep 2009 14:22

Re: Problem mit globalem Exception Handling
 
Zitat:

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.

himitsu 5. Sep 2009 14:36

Re: Problem mit globalem Exception Handling
 
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 :warn:

Wie schon gesagt wurde:
Exceptions möglichs lokale da behandeln, wo sie auftreten.

Gravitar 5. Sep 2009 14:46

Re: Problem mit globalem Exception Handling
 
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.

himitsu 5. Sep 2009 14:52

Re: Problem mit globalem Exception Handling
 
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 :zwinker:

Ralf Kaiser 5. Sep 2009 15:15

Re: Problem mit globalem Exception Handling
 
Zitat:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Seite 1 von 2  1 2      

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