try catch
-
Hi,
Da ich mein Programm mal ein vernüftige Fehlerbehandlung spendieren will hab ich mir das Exception Handling unter C++ mal durchgelesen, dass grundlegende Prinzip hab ich verstanden. Nur wo setze ich die die try catch Blöcke bei etwas grösseren Programmen hin? Eine grosse in die main Funktion? Dann wären alle catch Blöcke ja sehr zentral und müsste nur in den Methoden mittels throw die Fehlermeldungen(bzw. Fehlerobjekte da ich eine Fehlerklasse extra dafür anlege werde) hochschmeissen.
Oder ich pack sogesagt jede Methode wo ein Fehler passiert kann in ein try catch Block ein und werf da die Fehler und werde sofort in der Methode den Fehler abfangen? Da hätte ich ja dann alle Sachen zum Auffangen verteilt. Könnte allerdings Sachen weiterwerfen
Also wie wird das bei etwas grösseren Programmen gehandhabt wo man nicht mehr nur ein zwei Fehler werfen kann?
Vielleicht kann ja jemand auch mal seine Fehlerklasse posten.
(Mein Hintergedanke ist das ich halt alle Fehlermeldungen zentral über die Fehlerklasse steuern will damit ich vielleicht später wenn ich will die Fehlermeldungen einfach in eine Log Datei schreiben kann)MFG
xmarvel
-
An dieser Stelle an der du auf den Fehler reagieren willst.
-
Du brauchst nicht ein Fehlerklasse um auf alles zu reagieren. Wäre ja Schwachsinnig, dann würdest du alle Fehler mit dem gleichen catch-Block fangen und das ist nicht Sinn und Zweck des ganzen.
Wenn du die Fehler loggen willst wäre eine anständige Log-Klasse besser und wenn ein Fehler gefangen wird, dann rufst du einfach eine Methode auf und logst.
-
Die try-catch-Blöcke werden dahin gelegt, wo man die Exceptions abfangen will. Hat nichts mit großem oder kleinem Programmen zu tun. In die main() ein zentralen try-catch einzubauen ist sinnlos, da man damit keinen Fehler behandeln kann. Denn es geht ja darum, auf einen bestimmten Fehler in einer bestimmten Situation zu reagieren. Das kann man zentral nicht sinnvoll machen.
Schau dir bitte folgendes mal an:
http://www.kharchi.de/cppratgeber3.htm
-
Beispiel:
#include <iostream> #include <vector> #include <stdexcept> const char NL = '\n'; void wait() { std::cin.clear(); std::streambuf * pbuf = std::cin.rdbuf(); std::streamsize size = pbuf->in_avail(); std::cin.ignore(size); std::cin.get(); } int main() { std::vector<int> v(10); try { v.at(42) = 10; } catch(std::out_of_range& ex) { std::cout << ex.what() << NL; } wait(); }
-
Artchi schrieb:
In die main() ein zentralen try-catch einzubauen ist sinnlos, da man damit keinen Fehler behandeln kann.
Das ist ntaürlich vollkommener Humbug.
Es ist sinnvoll in der main noch einen zentralen try-catch-Block hinzuhängen der alles fängt, was nicht vorher gefangen wurde, noch ne ordentliche Fehlermeldung ausgibt und das ganze Programm ordentlich runterfährt. (Vielleicht kann man sogar noch ne kurze Beschreibung irgendwohin loggen?)
Warum auch sollte man das Programm komplett abstürzen lassen???
-
Allgemein sollte man Exceptions nur in außergewöhnlichen Fällen benutzen (Exception bedeutet Ausnahme) und außerdem noch ne Menge Gehirnschmalz reinstecken. Beim Werfen einer Exception springt die Programmausführung quer durch den Code, wenn man zu viele von den Dingern benutzt kommt das schon fast einem Spaghetticode gleich.
Beispiel:Usereingaben sind kein Grund für Exceptions. Es ist nämlich kein Ausnahmefall, dass ein User irgendwelche Zeichen eingibgt, die das Programm grad nicht gebrauchen kann.
Wenn eine Datei nicht existiert, ist das noch kein Grund zur Ausnahme, es sei denn man hat die Datei vorher selbst erzeugt oder sie war schonmal da und ist plötzlich verschwunden. Im Normalfall sollte eine herkömmliche Fehlerbehandlung benutzt werden. Der Programmierer kann schließlich nicht erwarten dass zu jedem Dateinamen der ihm grad einfällt auf dem System des Benutzers auch die entsprechende Datei existiert. Es ist auch keine Ausnahmesituation dass der User das programm und die zugehörigen Dateien nicht so installiert hat wie vorgesehn...
Zu wissen, wie man mit Exceptions umgeht sollte nicht anlass sein, sie an Stellen zu benutzen, wo es auch ohne geht. Mehr zu dem Thema findet man u.a. in Scott Myers' "effektiv C++ programmieren" und "mehr effektiv C++ programmieren" sowie in Hunt/Thomas' "Der Pragmatische Programmierer"
-
Nun ich finde doch, dass man Exceptions öfters nutzen sollte.
Es gibt ja grundsätzlich zwei Arten der Programmierung:
Immer den Rückgabewert von jeder Aktion prüfen oder einfach "arbeiten" und dann Fehler auffangen.Ich finde das z.B. "besser" :
File dat_("X"); try { dat_.open(); dat.write("BLA"); } catch (IOError e) { Fehlerbehandlung(e); } finally { dat_.close() }
Als immer nachzufragen. Ich mach einfach und wenn dann was passiert mach ich mir Gedanken.
-
Wenn Du deterministische Destruktoren hast kannste Dich sogar drauf verlassen, daß der Destruktor die Datei schließt.
Also fällt das finally weg. Wenn's nicht klappt, dann ist die Frage: kann die Methode groß was dran ändern? Kann sie wohl nicht, weil das ganze zu lokal ist um zu wissen was da überhaupt grad gemacht wird. Also läßt man auch das catch und damit auch den try-Block weg.
Die Funktion sieht also so aus:
File dat_("X"); dat_.open(); dat.write("BLA");
MfG Jester
P.S.: Exception-Safety is *not* about trying.
-
danke für die vielen Antworten ich werd dann mal Versuchen zu Unterscheiden wo man am besten try catch einsetzt. Mal schauen ob es mir halbwegs gelingt.
MFG
xmarvel
-
finally ???