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 

Konstruktor fehlgeschlagen, und nun?
Goto page 1, 2, 3, 4, 5, 6  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Torsten Hensel
Guest





PostPosted: Wed Dec 10, 2003 10:26 am    Post subject: Konstruktor fehlgeschlagen, und nun? Reply with quote



Hi!

Was macht ein Konstruktor, wenn bei seiner Erzeugung ein Fehler
auftritt?

Ich habe eine Klasse, die Informationen über eine Datei enthält. Dem
Konstruktor übergebe ich den Dateinamen. Das Erzeugen des Objekts
sollte dabei eigentlich immer funktionieren (außer zu wenig
Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?

myClass::myClass (char* filename) {
if (errorOccurs) {
// FEHLER!
}
}

Ciao
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
Kostka, Volkmar
Guest





PostPosted: Wed Dec 10, 2003 7:12 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote




Hallo,

Torsten Hensel wrote:
Quote:
Hi!

Was macht ein Konstruktor, wenn bei seiner Erzeugung ein Fehler
auftritt?

Ich habe eine Klasse, die Informationen über eine Datei enthält. Dem
Konstruktor übergebe ich den Dateinamen. Das Erzeugen des Objekts
sollte dabei eigentlich immer funktionieren (außer zu wenig
Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?

myClass::myClass (char* filename) {
if (errorOccurs) {
// FEHLER!
}
}

Da kannst du nur eine Exception werfen oder ein Fehlerbit setzen, das du
dann abfragen kannst zB ueber operator bool();

MFG

Volkmar Kostka

--
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
Marco Budde
Guest





PostPosted: Wed Dec 10, 2003 8:22 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote



Torsten Hensel wrote:

Quote:
Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?

Dann wirft man eine Exception. Das bedeutet dann auch gleich, daß das
Objekt *nicht* angelegt ist.

Das bringt Dich dann auch gleich zur nächsten Frage: darf man auch im
Destruktor Exceptions werfen. Ja, darf man, sollte man aber nicht.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
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
Marcel Müller
Guest





PostPosted: Thu Dec 11, 2003 8:23 am    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Hallo,

Marco Budde wrote:

Quote:
Torsten Hensel wrote:

Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?

Dann wirft man eine Exception. Das bedeutet dann auch gleich, daß das
Objekt *nicht* angelegt ist.

Das führt mich zur nächsten Frage:
Wenn ein Konstruktor per Exception abbricht, wird ja kein Destruktor
aufgerufen. Keiner? Oder nur nicht der der fehlgeschlagenen Klasse. Wie
sieht es mit Members/Basisklassen aus?


Quote:
Das bringt Dich dann auch gleich zur nächsten Frage: darf man auch im
Destruktor Exceptions werfen. Ja, darf man, sollte man aber nicht.

Gute Idee Smile
--
Marcel Müller

--
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 Hensel
Guest





PostPosted: Thu Dec 11, 2003 10:50 am    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Marco Budde <mb-news-a (AT) linuxhaven (DOT) de> wrote:
Quote:
Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?
Dann wirft man eine Exception. Das bedeutet dann auch gleich, daß das
Objekt *nicht* angelegt ist.

Ok, dann ist das wohl mein Weg... first contact mit Exceptions... "we
are exceptions, resistance is futile!" - und ich hatte schon gedacht,
ich komme um sie herum...

Quote:
Das bringt Dich dann auch gleich zur nächsten Frage: darf man auch im
Destruktor Exceptions werfen. Ja, darf man, sollte man aber nicht.

Wobei ich das nicht brauchen werde. Mein Destruktor ist zur Zeit (und
hoffentlich auch später) leer.

Ciao
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
Ralf Bartzke
Guest





PostPosted: Thu Dec 11, 2003 12:47 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Kostka, Volkmar schrieb:
Quote:

Hallo,

Torsten Hensel wrote:

Hi!

Was macht ein Konstruktor, wenn bei seiner Erzeugung ein Fehler
auftritt?

Ich habe eine Klasse, die Informationen über eine Datei enthält. Dem
Konstruktor übergebe ich den Dateinamen. Das Erzeugen des Objekts
sollte dabei eigentlich immer funktionieren (außer zu wenig
Speicher?). Wenn die Datei jedoch nicht existiert oder aus welchem
Grund auch immer nicht lesbar ist soll dies irgendwie bekannt gemacht
werden - was ist die übliche Variante?

myClass::myClass (char* filename) {
if (errorOccurs) {
// FEHLER!
}
}


Da kannst du nur eine Exception werfen oder ein Fehlerbit setzen, das du
dann abfragen kannst zB ueber operator bool();

MFG

Volkmar Kostka

Exceptions funktionieren, wenn der Compiler diese unterstützt bzw. die

Ünterstützung dafür auch aktiviert ist. Das kostet scheinbar global
etwas Performance bei Funktionsaufrufen.

Ich würde deshalb in Konstruktoren grundsätzlich nur Dinge zu tun, die
nicht schiefgehen können. Alles andere ist in Member-Funktionen auslagern.

Das bedeutet, benötigter Speicher ist bereits alloziert zu übergeben,
Files sind vorher öffen usw. .

Ralf

--
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
Norbert Riedlin
Guest





PostPosted: Thu Dec 11, 2003 1:04 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

"Marco Budde" <mb-news-a (AT) linuxhaven (DOT) de> schrieb im Newsbeitrag
news:3FD78071.B95BA93 (AT) linuxhaven (DOT) de...
Quote:

Das bringt Dich dann auch gleich zur nächsten Frage: darf man auch im
Destruktor Exceptions werfen. Ja, darf man, sollte man aber nicht.

Du meinst vermutlich das richtige, aber drueckst es zu schwach aus. Es muss

heissen (o.ae.):
Nichts in der Grammatik verbietet es, in Destruktoren Exceptions zu erzeugen
bzw. sie
durchzulassen. Aber es ist hoechst unmoralisch, gefaehrlich. und man kann
keine funktionierenden
Programme schreiben, wenn man es zulaesst, dass Exceptions Destruktoren
verlassen!!! (Viele
Ausrufezeichen!)

Deshalb Regel #1: Nein, Destruktoren duerfen _keine_ Exceptions durchlassen!

Naehere Erlaeuterungen in Herb Sutters Buechern: "Exceptional C++" und "More
Exceptional C++"

Bis dann

Norbert

--
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
Hannah Schroeter
Guest





PostPosted: Thu Dec 11, 2003 3:02 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Hallo!

Ralf Bartzke <ralf.bartzke (AT) t-online (DOT) de> wrote:
Quote:
[...]

Exceptions funktionieren, wenn der Compiler diese unterstützt bzw. die
Ünterstützung dafür auch aktiviert ist. Das kostet scheinbar global
etwas Performance bei Funktionsaufrufen.

Das letztere kommt auf die Implementierung an. Es gibt wohl auch
Implementierungen, die nur dann Kosten verursachen, wenn tatsächlich
eine Ausnahme ausgelöst wird.

Quote:
[...]

Gruß,

Hannah.

--
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
Ludwig Pumberger
Guest





PostPosted: Thu Dec 11, 2003 3:10 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Ralf Bartzke schrieb:

Quote:
Exceptions funktionieren, wenn der Compiler diese unterstützt bzw. die
Ünterstützung dafür auch aktiviert ist. Das kostet scheinbar global
etwas Performance bei Funktionsaufrufen.

Ich würde deshalb in Konstruktoren grundsätzlich nur Dinge zu tun, die
nicht schiefgehen können. Alles andere ist in Member-Funktionen
auslagern.

Das bedeutet, benötigter Speicher ist bereits alloziert zu übergeben,
Files sind vorher öffen usw. .

Das geht ja nun komplett am Sinn der Konstruktoren vorbei. Eine marginale
Verringerung der Laufzeiteffizienz bin ich im Zweifelsfall stetts bereit
gegen stabilere, besser les- und wartbare Programm einzutauschen
(abgesehen von wenigen laufzeitkritischen Teilen vielleicht).
In jedem Fall wird das ganze Konzept durch solche Konstruktoren umgangen.
Besser als allokierten Speicher zu übergeben wäre immer noch ein
"Pseudoc'tor" Init o.ä. der den Benutzer zumindest davor verschont wissen
zu müssen welche Ressourcen die Klasse braucht. Ausserdem frage ich mich
ob das klassische Fehlercode-weiterreichen tatsächlich soviel performanter
ist als Exceptionhandling.

--
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
King Leo - Martin Oberzal
Guest





PostPosted: Thu Dec 11, 2003 3:16 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Ludwig Pumberger wrote:

Quote:
Ralf Bartzke schrieb:

Exceptions funktionieren, wenn der Compiler diese unterstützt bzw. die
Ünterstützung dafür auch aktiviert ist. Das kostet scheinbar global
etwas Performance bei Funktionsaufrufen.

Ausserdem frage ich mich
ob das klassische Fehlercode-weiterreichen tatsächlich soviel performanter
ist als Exceptionhandling.

BTW:

Hat irgendjemand hier ein reales Anwendungsbeispiel für Exceptions, bei dem
eine Exception mehr mals geworfen wird, das Programm selbst aber nicht
abbricht.

Ich hab hier immer nur sowas wie: Kommandozeilenargumente überprüfen; Und
wenn da was falsch ist, kommt einen Fehlermeldung, der Help Screen und das
wars.

Gruß, Martin!

--
Wenn man einen 17'' Monitor mit einem 2'' Display vergleicht, fragt
man sich schon, wo da an einem Mobiltelefon der technische
Fortschritt zu finden ist. Alexander Oberzalek

--
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
André Pönitz
Guest





PostPosted: Thu Dec 11, 2003 6:22 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

King Leo - Martin Oberzalek <kingleo (AT) gmx (DOT) at> wrote:
Quote:
Hat irgendjemand hier ein reales Anwendungsbeispiel für Exceptions, bei dem
eine Exception mehr mals geworfen wird, das Programm selbst aber nicht
abbricht.

Du meinst, exceptions als 'rrichtiger' Bestandteil der Programmlogik?

Ich hab hier 'n Breitensuchen-Template, dass immer mit exception endet
(wenn er das Ziel erreicht hat). Das war einfach kuerzer als staendig
jede (nutzer-definierte) Funktion zu fragen, ob sie's geschafft hat.
Direkt notwendig isses aber nicht.

Andre'

--
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
Marco Budde
Guest





PostPosted: Thu Dec 11, 2003 7:43 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Torsten Hensel wrote:

Quote:
Ok, dann ist das wohl mein Weg... first contact mit Exceptions... "we
are exceptions, resistance is futile!" - und ich hatte schon gedacht,
ich komme um sie herum...

Warum willst Du um Exceptions herumkommen? Das ist neben Templates
eine der wichtigsten neuen Features von C++.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
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
Marco Budde
Guest





PostPosted: Thu Dec 11, 2003 7:44 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Norbert Riedlin wrote:

Quote:
Deshalb Regel #1: Nein, Destruktoren duerfen _keine_ Exceptions durchlassen!

IHMO macht es sowieso keinen Sinn, in einem Destruktor Fehler zu melden.
Was soll der User damit anfangen? Ist genau unsinnig wie z.B. das
Zurückmelden von Fehlern in einer Funktion wie IO::Close().

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
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
Marco Budde
Guest





PostPosted: Thu Dec 11, 2003 7:49 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Ralf Bartzke wrote:

[Bitte mal das Zitieren in Mail/News erlernen. Vollquotes nerven.]

Quote:
Exceptions funktionieren, wenn der Compiler diese unterstützt

Jeder ANSI C++ Compiler muß Exceptions unterstützen.

Quote:
bzw. die
Ünterstützung dafür auch aktiviert ist.

Wofür das abschaltbar bei einigen Compilern (bei MS ist
"aus" sogar Default) gut sein soll, verstehe ich bis heute nicht.
Schon die STL kann jederzeit Exceptions werfen.

Quote:
Das kostet scheinbar global
etwas Performance bei Funktionsaufrufen.

Das manuelle Abfangen von Fehlern (wird gerne unterlassen) kostet
die gleiche Performance.

Quote:
Ich würde deshalb in Konstruktoren grundsätzlich nur Dinge zu tun, die
nicht schiefgehen können.

Das ist doch nun totaler Unfug. Schon das Anlegen des Objektes selber
kann mit einer Exception fehlschlagen (geworfen von "new").

Quote:
Alles andere ist in Member-Funktionen auslagern.

Bitte nicht, das erinnert mich an die kranken manuellen Destruktoren
in C# und Java, die man per Hand aufrufen muß. Das ist einfach nicht
mehr Stand der Technik.

Quote:
Das bedeutet, benötigter Speicher ist bereits alloziert zu übergeben,
Files sind vorher öffen usw. .

Das ist aber keine OO-Programmierung mehr, goto Assembler Smile.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
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
Marco Budde
Guest





PostPosted: Thu Dec 11, 2003 7:50 pm    Post subject: Re: Konstruktor fehlgeschlagen, und nun? Reply with quote

Ludwig Pumberger wrote:

Quote:
Ausserdem frage ich mich
ob das klassische Fehlercode-weiterreichen tatsächlich soviel performanter
ist als Exceptionhandling.

Ist es, weil es komplett unterbleibt. Wer hat schon Lust, in jeder
Zeile den Return Value einer Funktion abzutesten?

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
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
Goto page 1, 2, 3, 4, 5, 6  Next
Page 1 of 6

 
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.