Autor Beitrag
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 19.08.13 08:24 
Ich habe folgende Situation:
Aus dem Hauptformular einer Anwendung erzeuge ich ein DataModule.
Im OnCreate des DataModules wird einiges initialisiert. Sollte das fehlschlagen, muss die Anwendung beendet werden.

Dies wollte ich mit einem Exception-Handling lösen. Das Beenden der Anwendung ist im OnCreate des DataModules nicht möglich. Also wollte ich die Exception weiterreichen (raise) an das Hauptformular. Dies funktioniert nicht. Die Exception kommt dort nicht an.

Lagere ich die Initialisierung in eine eigene Methode das DataModules aus und rufe diese nach der Erzeugung der Instanz auf, klappt alles wunderbar. Die Exception wird bis ins Hauptformular durchgereicht und ich kann die Anwendung sauber beenden.

Mit dieser Lösung kann ich zwar leben, aber ich würde gerne wissen, warum das so ist. Kann eine Exception nicht weitergereicht werden, wenn die Instanz noch nicht erzeugt wurde? Denn das ist ja eigentlich die Situation, wenn ich im OnCreate bin. Und falls das daran liegt, dann ist immer noch die Frage nach dem Warum. Ich vermute, dass die Instanz im OnCreate einfach noch nicht existiert und daher nicht bekannt ist, wer das raise bekommen soll.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 19.08.13 09:15 
Das ist genau der Grund weshalb man im Konstruktor (und schon gar nicht in einem Eventhandler für OnCreate) nichts machen sollte außer Standardwerte setzen oder Objekte für Felder des Objekts erzeugen. Beim Konstruktor hat das den Hintergrund, dass sonst das finally im try..finally trotz eines Initialisierungsfehlers durchlaufen wird. Passiert aber eine Exception im Konstruktor wird das gerade erstellte Objekt automatisch wieder aufgeräumt und die Deinitialisierung würde in der Regel selbst einen Fehler verursachen.

Im Eventhandler OnCreate wird eine Exception jedoch (wie ein Blick in den Quelltext auch gezeigt hätte ;-)) abgefangen, wenn ein entsprechender Eventhandler installiert ist. Das ist normalerweise der Fall, nämlich weitergeleitet auf TApplication.HandleException. Dort wird die Exception dann einfach als ShowMessage angezeigt und dann normal weitergemacht.

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Lagere ich die Initialisierung in eine eigene Methode das DataModules aus und rufe diese nach der Erzeugung der Instanz auf, klappt alles wunderbar. Die Exception wird bis ins Hauptformular durchgereicht und ich kann die Anwendung sauber beenden.
Sauber ist das aber auch nicht. Sauber wäre, wenn das Datenmodul zuerst erstellt wird und das Hauptfenster nur erzeugt würde, wenn es auch angezeigt werden soll...
jasocul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 19.08.13 09:41 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das ist genau der Grund weshalb man im Konstruktor (und schon gar nicht in einem Eventhandler für OnCreate) nichts machen sollte außer Standardwerte setzen oder Objekte für Felder des Objekts erzeugen. Beim Konstruktor hat das den Hintergrund, dass sonst das finally im try..finally trotz eines Initialisierungsfehlers durchlaufen wird. Passiert aber eine Exception im Konstruktor wird das gerade erstellte Objekt automatisch wieder aufgeräumt und die Deinitialisierung würde in der Regel selbst einen Fehler verursachen.

Da sind wir auf einer Linie. Weitergehende Aktionen stehen bei mir auch nicht im OnCreate. Die bekommen bei mir eigene Methoden oder kommen in andere passende Ereignisse (z.B. OnActivate, OnShow) wenn es sinnvoll ist. Diese Ereignisse gibt es aber bei eine DataModule nicht. Leichtsinnigerweise hatte ich meine sonstige Vorgehensweise ignoriert und diesmal mehr ins OnCreate gepackt.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Im Eventhandler OnCreate wird eine Exception jedoch (wie ein Blick in den Quelltext auch gezeigt hätte ;-)) abgefangen, wenn ein entsprechender Eventhandler installiert ist. Das ist normalerweise der Fall, nämlich weitergeleitet auf TApplication.HandleException. Dort wird die Exception dann einfach als ShowMessage angezeigt und dann normal weitergemacht.

Einen eigenen Event-Handler wollte ich für so eine simple Initialisierung eigentlich nicht programmieren. :wink:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Lagere ich die Initialisierung in eine eigene Methode das DataModules aus und rufe diese nach der Erzeugung der Instanz auf, klappt alles wunderbar. Die Exception wird bis ins Hauptformular durchgereicht und ich kann die Anwendung sauber beenden.
Sauber ist das aber auch nicht. Sauber wäre, wenn das Datenmodul zuerst erstellt wird und das Hauptfenster nur erzeugt würde, wenn es auch angezeigt werden soll...

Nicht sauber? Das ist wohl eher eine Frage, wie man die Anwender über den Fehler informiert. Ich bevorzuge es, wenn wenigstens das Hauptfenster angezeigt wird, damit die Anwender sofort erkennen, wozu die Fehlermeldung gehört. Aber das ist eher eine Geschmacksfrage.
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 174
Erhaltene Danke: 43



BeitragVerfasst: Mo 19.08.13 10:12 
Statt das Event "OnCreate" zu nutzen, kann man auch den Konstruktor "Create" überschreiben.
Exception werden hier direkt an den Erzeuger weitergegeben.
Allerdings sind zu diesem Zeitpunkt eventuell noch nicht alle Aktionen möglich, das Erzeugen des Formulars ist ja noch nicht abgeschlossen.

Für diesen Beitrag haben gedankt: jasocul
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 19.08.13 10:23 
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Nicht sauber? Das ist wohl eher eine Frage, wie man die Anwender über den Fehler informiert. Ich bevorzuge es, wenn wenigstens das Hauptfenster angezeigt wird, damit die Anwender sofort erkennen, wozu die Fehlermeldung gehört. Aber das ist eher eine Geschmacksfrage.
Ansichtssache... mich nervt dieses Verhalten bei Excel / Word (den einzigen Programmen, von denen ich das kenne).
Aber das kommt vielleicht auch auf das Programm an.

Ich war aber auch gar nicht auf die Idee gekommen, dass du das so haben willst. ;-) Dann ist das ja deine Sache. Die meisten machen das ja eher, weil sie nicht wissen wie sonst.
jasocul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 19.08.13 10:36 
@Blup:
Oh man. Da hätte ich auch selbst drauf kommen können. :autsch:

@jaenicke:
Geschmackssache eben. :beer: