 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Torsten Hensel Guest
|
Posted: Wed Dec 10, 2003 10:26 am Post subject: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Wed Dec 10, 2003 7:12 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Wed Dec 10, 2003 8:22 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 8:23 am Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
--
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
|
Posted: Thu Dec 11, 2003 10:50 am Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 12:47 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 1:04 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
"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
|
Posted: Thu Dec 11, 2003 3:02 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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.
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
|
Posted: Thu Dec 11, 2003 3:10 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 3:16 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 6:22 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 7:43 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 7:44 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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
|
Posted: Thu Dec 11, 2003 7:49 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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 .
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
|
Posted: Thu Dec 11, 2003 7:50 pm Post subject: Re: Konstruktor fehlgeschlagen, und nun? |
|
|
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 |
|
 |
|
|
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
|
|