 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Torsten Mohr Guest
|
Posted: Tue May 11, 2004 2:12 am Post subject: throw exception, throw new exception, einige Fragen zu Excep |
|
|
Hallo,
ich habe beide Varianten schon gesehen, gibt es Gründe für
und/oder gegen die eine oder andere Variante?
Ich möchte im Fehlerfall aussagekräftige Meldungen zurückgeben,
ist es hier sinnvoll von std::exception abzuleiten?
Wie kann ich den Fehlertext dann am geschicktesten zusammenbauen,
leite ich eigene Exceptions von std::exception ab, füge einen
std::string hinzu und lasse in der Methode "what" einen Zeiger
auf das data() des Strings zurückliefern?
Danke für Tipps,
Torsten.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Tue May 11, 2004 10:57 am Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
"Torsten Mohr" <tmohr@s.netic.de> schrieb:
| Quote: | Ich möchte im Fehlerfall aussagekräftige Meldungen zurückgeben,
ist es hier sinnvoll von std::exception abzuleiten?
Wie kann ich den Fehlertext dann am geschicktesten zusammenbauen,
leite ich eigene Exceptions von std::exception ab, füge einen
std::string hinzu und lasse in der Methode "what" einen Zeiger
auf das data() des Strings zurückliefern?
|
1) Benutze die vorhandenen Klassen in <stdexcept>!
2) Verzichte auf »new« wo immer es geht! (Gilt nicht nur für
Exceptions.)
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Tue May 11, 2004 11:53 am Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Torsten Mohr wrote:
| Quote: | ich habe beide Varianten schon gesehen, gibt es Gründe für
und/oder gegen die eine oder andere Variante?
|
new ist an dieser Stelle _total_ fehl am Platz.
Exceptions werden als Objekte geworfen und als Referenz
gefangen.
#include <stdexcept>
#include <iostream>
int main() {
try {
throw std::runtime_error( "Something went wrong!" );
} catch( std::exception &e ) {
std::cerr << e.what() << 'n';
}
}
So wuerde es im Normalfall aussehen.
| Quote: | Ich möchte im Fehlerfall aussagekräftige Meldungen zurückgeben,
ist es hier sinnvoll von std::exception abzuleiten?
|
Ich mache das meist so, dass ich in einer Anwendung eine Klasse
class bla::RuntimeError: public std::runtime_error { /* ... */ };
habe, von der ich alle anderen Exceptions ableite. So kann
ich dann im Programm sowas machen:
catch( bla::RuntimeError &e ) {
cerr << "Programminterne Ausnahme gefangen: ""
<< e.what() << ""n";
} catch( std::exception &e ) {
cerr << "Systemausname gefangen: ""
<< e.what() << ""n";
}
MfG,
Daniel Albuschat
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue May 11, 2004 12:24 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Torsten Mohr wrote:
| Quote: | Hallo,
ich habe beide Varianten schon gesehen, gibt es Gründe für
und/oder gegen die eine oder andere Variante?
|
Es gibt keine für die Verwendung von new. Aber wenn du es verwendest,
muß der Fänger sich im die Zerstörung des Objekts kümmern, daher ist
das Werfen von Zeigern auf dynamisch erzeugte Exceptions nicht
sinnvoll. Manche Exceptions (z.B. für "Speicher voll") könnten auch gar
nicht dynamisch erzeugt werden.
| Quote: | Ich möchte im Fehlerfall aussagekräftige Meldungen zurückgeben,
ist es hier sinnvoll von std::exception abzuleiten?
|
Du kannst entweder von std::exception ableiten oder eine eigene
Hiererchie aufbauen. Letzteres hat den Vorteil, daß du auch auf
einfache Weise nur die std-Exceptions fangen kannst und eigene nicht.
Ich habe selbst noch nicht viel mit Exceptions gearbeitet, deshalb weiß
ich nicht, ob es einen wirklichen Vorteil gibt, wenn man von
std::exception ableitet.
| Quote: | Wie kann ich den Fehlertext dann am geschicktesten zusammenbauen,
leite ich eigene Exceptions von std::exception ab, füge einen
std::string hinzu und lasse in der Methode "what" einen Zeiger
auf das data() des Strings zurückliefern?
|
Falls du das brauchst. Meist reicht aber ein statischer Text völlig aus.
Dann ist es sowas wie:
struct UnbekannterBefehl : public MeineException
{
virtual const char* what() const
{
return "Du Perverser, sowas tue ich nicht!";
}
};
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue May 11, 2004 2:48 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Daniel Albuschat wrote:
| Quote: | #include
#include
int main() {
try {
throw std::runtime_error( "Something went wrong!" );
} catch( std::exception &e ) {
|
Warum nicht "const std::exception& e"?
| Quote: | std::cerr << e.what() << 'n';
}
}
So wuerde es im Normalfall aussehen.
Ich möchte im Fehlerfall aussagekräftige Meldungen zurückgeben,
ist es hier sinnvoll von std::exception abzuleiten?
Ich mache das meist so, dass ich in einer Anwendung eine Klasse
class bla::RuntimeError: public std::runtime_error { /* ... */ };
habe, von der ich alle anderen Exceptions ableite. So kann
ich dann im Programm sowas machen:
catch( bla::RuntimeError &e ) {
cerr << "Programminterne Ausnahme gefangen: ""
e.what() << ""n";
} catch( std::exception &e ) {
cerr << "Systemausname gefangen: ""
e.what() << ""n";
}
|
Es sei denn, du willst nur Systemausnahmen fangen und deine eigenen in
der Aufrufhierarchie weiter hochwandern lassen. Das ließe sich aber
zugegebenermaßen mit einem dynamic_cast auch machen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Tue May 11, 2004 4:01 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Rolf Magnus wrote:
| Quote: | Daniel Albuschat wrote:
#include
#include
int main() {
try {
throw std::runtime_error( "Something went wrong!" );
} catch( std::exception &e ) {
Warum nicht "const std::exception& e"?
|
Stimmt, habe ich nie drueber nachgedacht.
std::exception::what ist ja nicht umsonst const...
| Quote: | Es sei denn, du willst nur Systemausnahmen fangen und deine eigenen in
der Aufrufhierarchie weiter hochwandern lassen. Das ließe sich aber
zugegebenermaßen mit einem dynamic_cast auch machen.
|
Das koennte man dann mit:
catch( bla::RuntimeError &e ) {
throw;
} catch( std::exception &e ) {
cerr << "Systemausname gefangen: ""
<< e.what() << ""n";
}
machen.
MfG,
Daniel Albuschat
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Mohr Guest
|
Posted: Tue May 11, 2004 10:26 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Hallo,
vielen Dank für eure Tipps, ich werde dann eine eigene
Klasse von std::exception ableiten und folgendes catch
verwenden:
catch(const std::excetion& e) { }
Viele Grüsse,
Torsten.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed May 12, 2004 9:59 am Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Daniel Albuschat wrote:
| Quote: | Rolf Magnus wrote:
Daniel Albuschat wrote:
#include
#include
int main() {
try {
throw std::runtime_error( "Something went wrong!" );
} catch( std::exception &e ) {
Warum nicht "const std::exception& e"?
Stimmt, habe ich nie drueber nachgedacht.
std::exception::what ist ja nicht umsonst const...
|
Ich meine auch, mich zu erinnern, daß es gute Gründe für Fangen per
const-Referenz gibt, aber die weiß ich nicht mehr.
| Quote: | Es sei denn, du willst nur Systemausnahmen fangen und deine eigenen
in der Aufrufhierarchie weiter hochwandern lassen. Das ließe sich
aber zugegebenermaßen mit einem dynamic_cast auch machen.
Das koennte man dann mit:
catch( bla::RuntimeError &e ) {
throw;
} catch( std::exception &e ) {
cerr << "Systemausname gefangen: ""
e.what() << ""n";
}
|
Das const ist ja schon wieder weg
Abgesehen davon hast du natürlich recht. Ich hab zu kompliziert gedacht.
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Wed May 12, 2004 6:34 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Rolf Magnus wrote:
| Quote: | Daniel Albuschat wrote:
Rolf Magnus wrote:
Warum nicht "const std::exception& e"?
Stimmt, habe ich nie drueber nachgedacht.
std::exception::what ist ja nicht umsonst const...
Ich meine auch, mich zu erinnern, daß es gute Gründe für Fangen per
const-Referenz gibt, aber die weiß ich nicht mehr.
|
Ich denke, der einzige Grund wäre "Selbstschutz" bzw. eben die
Beeinflussung der Methodenauswahl bei dem gefangenen Objekt. Während
catch (std::string& s) { std::cout << s[0]; }
die non-const-Variante von operator[] aufruft (die potenziell recht
aufwändig ist), ergibt
catch (const std::string& s) { std::cout << s[0]; }
eben die weniger aufwändige const-Version. "Selbstschutz" wäre dann,
dass man einen Funktionsparameter oder eine lokale Variable als const
deklariert, um sie nicht versehentlich zu ändern.
Auf den Exception-Handling-Mechanismus selbst hat das const keinen
Einfluss. Bereits beim Werfen eines Objektes werden die äußeren
cv-Qualifizierer entfernt (15.1p3).
STefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Schlenger Guest
|
Posted: Thu May 13, 2004 8:32 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
On Tue, 11 May 2004 18:01:44 +0200, Daniel Albuschat
<daniel (AT) viming (DOT) de> wrote:
| Quote: | Rolf Magnus wrote:
Daniel Albuschat wrote:
#include
#include
int main() {
try {
throw std::runtime_error( "Something went wrong!" );
} catch( std::exception &e ) {
Warum nicht "const std::exception& e"?
Stimmt, habe ich nie drueber nachgedacht.
std::exception::what ist ja nicht umsonst const...
|
mit std::exception::what hat das weniger zu tun. Grundsätzlich gilt:
Verändert eine Funktion das per Verweis (Referenz oder Zeiger)
übergebene Objekt nicht, sollte dies durch const& (bzw. const*)
notiert werden.
Also: Möchtest du das dir im catch-Handler übergebene Ausnahmeobjekt
ändern, ist eine Übergabe als std::exception& angezeigt. Dies könnte
z.B. sinnvoll sein, um im Ausnahmeobjekt etwas zu verändern, bevor man
es erneut wirft.
Im Normalfall dagegen wird man eher const std::exception& verwenden
wollen, da man normalerweise Ausnahmeobjekte nicht verändert.
------------------------------------------------
Michael Schlenger
------------------------------------------------
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sat May 15, 2004 7:20 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Rolf Magnus wrote:
| Quote: | Ich habe selbst noch nicht viel mit Exceptions gearbeitet, deshalb weiß
ich nicht, ob es einen wirklichen Vorteil gibt, wenn man von
std::exception ableitet.
|
Das hängt ausschließlich von der Art ab, wie Du beim Fangen filtern willst.
Ich habe meine eigene Exception-Basisklasse so implementiert, daß man
über einen Makro konfigurieren kann, ob sie ihrerseits von std::excetion
abgeleitet ist, oder nicht. Wer also meine Exceptions und STL-Exceptions
mit einem einzigen catch-Zweig behandeln will, der kompiliert so, daß
meine Basis-Klasse ihrerseits von std::exception abgeleitet ist.
Wer mit einem Fänger für std::exception alle STL-Exections aber nicht
meine Excetions fangen will und auch nicht meine Exceptions unbehandelt
weiterwerfen will, der kompiliert eben so, daß meine Exceptions nicht
von std::exception abgeleitet sind.
Da ich von Applikation mal die eine, mal die andere Variante für
zweckmäßiger halte, ist das bei mir konfigurierbar. Meistens leite ich
nicht von std::exception ab, um gar nicht erst in den Verdacht zu
geraten mit einer STL-Exception verwechselbar zu sein. Der Fänger muß
dann meine Exception explizit fangen, d.h. sich zumindest mal Gedanken
darüber machen. Wenn er es nicht tut, dann verendet er halt mit einer
unhandled exception. Deshalb leite ich meistens ganz bewußt _nicht_ von
std::exception ab.
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Volker Glave Guest
|
Posted: Tue May 18, 2004 6:45 am Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Georg Maaß <georg (AT) bioshop (DOT) de> wrote
| Quote: | Rolf Magnus wrote:
Ich habe selbst noch nicht viel mit Exceptions gearbeitet, deshalb weiß
ich nicht, ob es einen wirklichen Vorteil gibt, wenn man von
std::exception ableitet.
Ich habe meine eigene Exception-Basisklasse so implementiert, daß man
über einen Makro konfigurieren kann, ob sie ihrerseits von std::excetion
abgeleitet ist, oder nicht. [...]
[...]
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
|
Interessehalber hab ich mal den Link verfolgt und hineingeschaut.
Allerdings kapiere ich schon die simpelsten Sachen nicht.
Z. B. in "exception.h++" steht [habe mir erlaubt, der Kürze und
der Geläufigkeit halber etwas anders zu formatieren, als bei dir
im Original]:
....
namespace gm {
class exception {
private: mutable char* whatStrPointer;
public: exception() throw(std::exception) : whatStrPointer(0) {};
....
In der Exception-Spezifikation wird "throw(std::exception)"
behauptet, ich sehe allerdings nicht, wie es dazu kommen können
sollte. Also, wie soll es dazu kommen können? Und, wenn es nicht
dazu kommen kann, ist die Spezifikation ein Fehler oder Absicht?
Falls Absicht, wieso?
(Noch ne Frage: Das überflüssige Semikolon am Ende scheint bei dir
Methode zu haben. Wozu ist das gut?)
Gruß
Volker
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Tue May 18, 2004 5:35 pm Post subject: Re: throw exception, throw new exception, einige Fragen zu E |
|
|
Volker Glave wrote:
| Quote: | In der Exception-Spezifikation wird "throw(std::exception)"
behauptet, ich sehe allerdings nicht, wie es dazu kommen können
sollte.
|
Es wird ein std::string benutzt, welcher solch eine Exception werfen
könnte. Deshalb steht das da.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|