Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sämtliche Fehlermeldungen abfangen (https://www.delphipraxis.net/50638-saemtliche-fehlermeldungen-abfangen.html)

Nicolai1234 28. Jul 2005 18:56


Sämtliche Fehlermeldungen abfangen
 
Hallo,
ich habe ein Programm geschrieben, das Timer benutzt, FTP-Komponenten, HTTP-Komponenten und vieles mehr.
Problem ist, dass das Programm nicht abstürzen darf! Bei der Anzahl der Komponenten etc. kommt dies aber ab und zu mal vor. (Verbindungsprobleme usw...)
Daher meine Frage. Wie kann ich alle Fehlermeldungen abfangen?
Mir ist egal in welcher Form. Von mir aus kann sich das Programm auch beenden und danach neu starten oder so.
Welche Mögichkeiten gibt es da?

Vielen Dank im voraus
Nicolai

Mr Whoopee 28. Jul 2005 19:17

Re: Sämtliche Fehlermeldungen abfangen
 
In erster Linie würde ich mit try und except arbeiten. Ich denke, dass das reicht.

Phistev 28. Jul 2005 20:04

Re: Sämtliche Fehlermeldungen abfangen
 
Oder nutze Application.OnException, damit kann man alle nicht behandelten Exceptions abfangen.

Chegga 28. Jul 2005 21:28

Re: Sämtliche Fehlermeldungen abfangen
 
Hi,

MfG Marc

Nicolai1234 28. Jul 2005 23:32

Re: Sämtliche Fehlermeldungen abfangen
 
Ja, try und except ist schon klar...
Ich dachte nur, es gäbe einen allgemeineren Weg. (ich kann ja schlecht das gesamte Programm in ein TRY rein packen.)
Naja, dann werde ich versuchen müssen alle Anweisungen einzuschachteln... Trotzdem Danke ;)

Ist es eigentlich sinnvoll, - mehr oder weniger - alle Functionen/Proceduren in Try-Except einzuschachteln?

Matze 28. Jul 2005 23:34

Re: Sämtliche Fehlermeldungen abfangen
 
Zitat:

Zitat von Nicolai1605
Ist es eigentlich sinnvoll, - mehr oder weniger - alle Functionen/Proceduren in Try-Except einzuschachteln?

Ich finde es allg. überhaupt nicht sinnvoll, einfach Fehler abzufangen, damit man so auch nie weiß, was die Ursache der Fehler war.

Nicolai1234 28. Jul 2005 23:38

Re: Sämtliche Fehlermeldungen abfangen
 
Naja, bei meine FTP-Komponente (Indy) zum Beispiel kommen manchmal (eher selten) Fehler, wenn man etwas hochladen möchte. Dann starte ich das Programm neu logge mich erneut ein und das ganze geht einwandfrei (alles mit der selben Config etc.)
Sowas kann ich leider nicht anders bekämpfen...

Luckie 28. Jul 2005 23:39

Re: Sämtliche Fehlermeldungen abfangen
 
Zitat:

Zitat von Nicolai1605
Ist es eigentlich sinnvoll, - mehr oder weniger - alle Functionen/Proceduren in Try-Except einzuschachteln?

Aus meinen Exception Tutorial:
Zitat:

Dass die strukturierte Ausnahmebehandlung funktioniert ist weniger eine Aufgabe des Betriebssystems,
sondern eigentlich des Compilers. Der Compiler muss am Anfang und am Ende von Ausnahmeblöcken
speziellen Code erzeugen. Außerdem muss der Compiler zum Ausführen Tabellen mit unterstützenden
Datenstrukturen anlegen und Callback Funktionen bereitstellen, die das Betriebssystem aufrufen kann, damit
es die Ausnahmeblöcke durchlaufen kann. Desweiteren ist der Compiler auch dafür zuständig den
Stackframe vorzubereiten und für sonstige zusätzliche Informationen.
Und:
Zitat:

Sinnvoller Einsatz von Exceptions
Generell teilt man den Programmfluss in drei Stufen ein: lowlevel Funktionen, highlevel Funktionen und GUI
Funktionen. Normalerweise rufen GUI Funktionen wie Events nur die komplexen highlevel Funktionen auf.
Lowlevel Funktionen sollten nun Exception frei sein. Die highlevel Funktionen sollten mit Exceptions arbeiten,
da deren Programmierung von aussagekräftigen Funktionsrückgabewerten viel zu kompliziert werden kann.
Exception erleichtern also in highlevel Funktionen deren Aufbau wesentlich.
Exceptions sollten niemals in Release-Funktionen benutzt werden. Der Grund ist ganz einfach: Solche
Funktionen werden meist gruppiert in übergeordneten Funktionen auftreten. Würde nun eine Exception
ausgelöst, würden die nachfolgenden Release-Funktionen ein Speicherleck verursachen. Würde man es
trotzdem machen, müsste der Programmierer nun jeden Aufruf solcher Release-Funktionen separat mit
einem try-finally schützen. Der Sinn und Zweck von Exception würde sinnlos werden.
Auf der anderen Seite ist es sinnvoll Exceptions in Allocator-Funktionen zu verwenden. Also in Funktionen in
denen Speicher angefordert wird. Tritt dort eine Exception auf, wird durch die Exception verhindert, dass
weiter sinnloser Speicher allokiert wird.

Try-except-Blöcke sollten immer mit Bedacht und sparsam eingesetzt werden. Ein vollständiges
"Abklemmen" aller Exceptions per try-except-Block ist fast immer schlecht aus Sicht der Wartung des
Programmes. Try-except-Blöcke sollten also gezielt nur auf einige Exception-Typen reagieren. Der Grund ist
offensichtlich. Das Ziel des Exception-Handlings sollte es sein für den Programmierer aussagekräftige
Ausnahmebedingungen für den Programmfluss zu visualisieren. Setzt man try-except-Blöcke unüberlegt ein,
so kann man dies Ziel nicht erreichen und der Vorteil von Exceptions geht verloren.
Generell gilt: Exceptions nur dann auslösen, wenn eine Bedingung eintrittunter der der Programmfluss
keinesfalls fortsetzbar ist.

Olli 29. Jul 2005 10:24

Re: Sämtliche Fehlermeldungen abfangen
 
Zitat:

Zitat von Nicolai1605
(ich kann ja schlecht das gesamte Programm in ein TRY rein packen.)

Du darfst dreimal raten wieso Windows abkackt, wenn es dein Programm tut. Oder wieso du bei Delphi-Programmen eine bestimmte Fehlermeldung mit Angabe des Runtime Error und bei Konsolenprogrammen fast die gleiche Meldung bekommst. Gleiches gilt für so ziemlich alle Frameworks die ich kenne.

@Luckie: Ich kann dir nicht zustimmen. Wenn du mal daran denkst, wo Exceptions überall schon vom System her eingesetzt werden, sollte dich das nachdenklich machen (übrigens setze ich gleiche Methode in einem meiner C++-Programme ein um ein Objekt erst dann zu erzeugen, wenn auch ein Zugriff darauf stattfindet - ansonsten gibt's das Objekt nicht - ist durchaus sehr sparsam).
Die Stackgröße wird immer wieder angepaßt, wenn eine Exception wegen Overflow auftritt. Voila ... nächstes Anwendungsgebiet. Also Exceptions sind schon eine feine Sache. Klar sollte man sie im Übermaß nicht einsetzen ... aber wozu auch. Exceptions sind ja gerade deswegen sinnvoll, weil sie die Filter auch durchlassen können, so daß sie auf den letzten Exception-Handler durchschlägt.

Nachtrag: Den ersten Absatz kannste fast komplett wegwerfen. Wenn du mal an den Trick denkst, den ich dir zusammen mit Motzi gezeigt hatte, wirst du feststellen, daß das Betriebssystem sowohl im K-Mode als auch im U-Mode eine Menge bei der Exceptionbehandlung zu tun hat. Ich sage nur: setzen der Debugregister. Nur weil du den entsprechenden K-Mode-Code nicht siehst, heißt es nicht er sei nicht da, zumal das setzen der DrX eine privilegierte Operation ist (würde im U-Mode also selber eine Exception auslösen).

Luckie 29. Jul 2005 10:28

Re: Sämtliche Fehlermeldungen abfangen
 
Da ich damals selbst noch nicht so viel wußte, habe ich mich da mehr auf die Aussage von Hagen verlassen in diesem Thread: http://www.delphipraxis.net/internal...ct.php?t=26734 Da ich ihn eigentlich als kompetent ansehe, dachte ich das wäre so in Ordnung. Nun scheint es da ja doch noch andere Meinungen zu geben.

Btw, der erste Absatz ist mehr oder weniger eine Aussage vom Richter, wenn ich mich nicht irre.


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