![]() |
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:
und der dazugehörigen Zuordnung des Ereignisses im OnCreate-Ereignis des Hauptformulars (FrmMain):
procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin MessageDlg('ERROR: ' + E.Message, mtError, [mbOK],0); end;
Delphi-Quellcode:
Dadurch erspare ich mit die vielen Try-Except-Blöcke.
Application.OnException := frmmain.MyExceptionHandler;
Nun aber zum Problem: Wie kann ich nach einer Exception den Focus auf das fehlerauslösende Feld legen? Gruß, Andreas |
Re: Problem mit globalem Exception Handling
Zitat:
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) |
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. |
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. |
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. |
Re: Problem mit globalem Exception Handling
Zitat:
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:
In der globalen Exception-Behandlungs-Routine wollte ich dann den Focus auf das MyErrorObject legen.
MyErrorObject := EdTurnierDatum; //MyErrorObject ist vom Typ TObject
// Hier passiert jetzt eine Exception, da das Datum ungültig ist datum := strtodate(EdTurnierDatum.text,fsDate);
Delphi-Quellcode:
Leider funktioniert genau das nicht. Vermutlich erlaubt Setfocus kein TObject. Aber was dann?
procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
var err : TObject; begin MessageDlg('ERROR: ' + E.Message, mtError, [mbOK],0); MyErrorObject.setfocus; end; Den Aufwand gegenüber 30-40 Try...exception...finally...Blöcken finde ich bei dieser Methode deutlich geringer. |
Re: Problem mit globalem Exception Handling
Zitat:
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. |
Re: Problem mit globalem Exception Handling
Zitat:
|
Re: Problem mit globalem Exception Handling
Eigentlich brauchte man in dieser Richtung garnicht erst weiterforschen, da dieses ja definitiv kein akzeptables Vorgehen ist,
Zitat:
(eine genauere Fehlermeldung bitte) PS: so als Tipp: schau mal wo SetFokus deklariert wurde ... mindestens diese Klasse müstest du definieren :zwinker: |
Re: Problem mit globalem Exception Handling
Zitat:
Delphi-Quellcode:
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.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 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