Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlerbehandlung - Umgang mit Exceptions (https://www.delphipraxis.net/130567-fehlerbehandlung-umgang-mit-exceptions.html)

Mr_G 10. Mär 2009 19:35


Fehlerbehandlung - Umgang mit Exceptions
 
Hallo zusammen,
ich schreibe gerade eine Klasse und muss mich um die Fehlerbehandlung kümmern. Ich hatte eigentlich vor ein Event zur Verfügung zu stellen, durch das man auf Fehler reagieren kann. Dennoch dachte ich, es wäre vielleicht sinnvoll eigene Exceptions einzubauen falls der Programmierer die gebotene Möglichkeit nicht nutzt.

Das Problem: Wenn ich nun sowohl das Event auslöse als auch eine Execption werfe bekommt der User evtl. zwei Meldungen wenn man im OnError-Event auch eine Meldung ausgeben will.

Ich frage mich nun ob das gegenläufige Ansätze sind? Ich zwinge eben den Programmierer mit Exceptions try...except-Blöcke zu nutzen oder er muss das Event nutzen.
Meine Idee das Problem zu umgehen wäre ein Flag zu nutzen und die Exceptions nur auszulösen, wenn dieses gesetzt ist.

Meine Frage: Wie macht man es denn richtig bzw. was ist guter Programmierstil? :coder:

Luckie 10. Mär 2009 19:39

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Vergiss die Ereignisse und arbeite mit Exceptions.

Mr_G 10. Mär 2009 19:47

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Sprich ein OnError-Event ist hier eher der schlechte Stil?
Ich muss zugeben, dass mich das etwas wundert. Ich habe so ein Event schon öfter gesehen und genutzt.

Apollonius 10. Mär 2009 19:56

Re: Fehlerbehandlung - Umgang mit Exceptions
 
In den meisten Fällen muss ich Luckie zustimmen. Sinnvoll halte ich ein OnError nur bei solchen Dingen wie Sockets, wo Fehler aufgrund ihrer asynchronen Natur schwer zu fangen sind. Sonst verleiten solche Events nur zu schlechtem Stil, d.h. einem globalen Handler ("Es ist ein Fehler aufgetreten"). Wenn der Programmierer Code aufruft und dieser Aufruf fehlschlägt, dann muss ihm der Fehler am Aufrufort um die Ohren gehauen werden! Ohne Kenntniss der Aufrufsituation kann sonst keine gute Fehlerbehandlung stattfinden.

mkinzler 10. Mär 2009 19:58

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Zitat:

Sonst verleiten solche Events nur zu schlechtem Stil, d.h. einem globalen Handler ("Es ist ein Fehler aufgetreten").
Ist aber bei Exception genauso- Auch diese kann man recht global abfangen

Mr_G 10. Mär 2009 19:59

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Oje... genau hier gehts los: Es handelt sich um eine Klasse zur Kommunikation via Sockets.
Was mach ich denn nun?

mkinzler 10. Mär 2009 19:59

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Dann wäre ein Event ok.

Luckie 10. Mär 2009 20:01

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Es ist umständlich. Der Programmierer muss dann immer noch eine Ereignisbehandlungsroutine schreiben. Mit Exceptions kann er den Fehler in der Routine abfangen in der er auftritt.

Und ausserdem führt das zu einem ewigen hin und her gescrolle im Code. Und wenn du dem Fehlererignis einen Fehlercode mitgibst, hast du in der Ereignisbahendlungsroutine irgendwann mal eine Ellen lange case-Abfrage, das ist auch unschön.

Apollonius 10. Mär 2009 20:01

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Zitat:

Zitat von mkinzler
Zitat:

Sonst verleiten solche Events nur zu schlechtem Stil, d.h. einem globalen Handler ("Es ist ein Fehler aufgetreten").
Ist aber bei Exception genauso- Auch diese kann man recht global abfangen

Schlimm genug, dass sich diese Praxis in Delphi so gut wie durchgesetzt hat. Ein Event zwingt einen praktisch dazu.

Mr_G 10. Mär 2009 20:09

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Ich hab da noch eine Idee... die ist aber glaube ich sehr "unsauber":
Das Event bekommt einfach einen var-Parameter mit dem es signalisieren kann ob es den Fehler behandelt hat (so im Stil con CanClose). Wurde der Fehler behandelt wird keine Exception geworfen, falls nicht werfe ich eben die Exception.

Apollonius 10. Mär 2009 20:11

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Die Sockets aus ScktComp machen es genau so.

Mr_G 10. Mär 2009 20:19

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Hab mir die Unit mal angesehen... die machen das mit dem ErrorCode so ähnlich. Das sind ja die alten Socket-Komponenten, oder?
Also wenn das kein unglaublich schlechter Stil ist, würde ich das einfach auch so machen.

Apollonius 10. Mär 2009 20:23

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Bei den Sockets finde ich das in Ordnung, weil es eben asynchrone Exceptions sind, die erst mitten in der Nachrichtenschleife auftreten. Einen Try-Except-Block kann man dafür nirgendwo sinnvoll platzieren; man müsste global Application.OnException anzapfen, was keine gute Idee ist, weil sich so leicht mehrere Handler in die Quere kommen.

Mr_G 10. Mär 2009 20:42

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Ok! Vielen Dank für eure Antworten! :dp:

Dezipaitor 10. Mär 2009 20:43

Re: Fehlerbehandlung - Umgang mit Exceptions
 
Ich sage, Exceptions sind die erste Wahl bei synchronen Events.

Fehler sollten immer ins Entwicklergesicht geschmettert werden :). Stille Fehler sind tödlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 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