C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

throw exception, throw new exception, einige Fragen zu Excep

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Torsten Mohr
Guest





PostPosted: Tue May 11, 2004 2:12 am    Post subject: throw exception, throw new exception, einige Fragen zu Excep Reply with quote



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





PostPosted: Tue May 11, 2004 10:57 am    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote



"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





PostPosted: Tue May 11, 2004 11:53 am    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote



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





PostPosted: Tue May 11, 2004 12:24 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Tue May 11, 2004 2:48 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Tue May 11, 2004 4:01 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Tue May 11, 2004 10:26 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Wed May 12, 2004 9:59 am    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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 Smile
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





PostPosted: Wed May 12, 2004 6:34 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Thu May 13, 2004 8:32 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Sat May 15, 2004 7:20 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Tue May 18, 2004 6:45 am    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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





PostPosted: Tue May 18, 2004 5:35 pm    Post subject: Re: throw exception, throw new exception, einige Fragen zu E Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.