Exception werfen in C++

Gast #6185039
Ich bin mit dem Exception-Handling von Java vertraut, wo man nur Objekte 
werfen kann, die von der Klasse Throwable abgeleitet sind.

Jetzt habe ich gelesen, dass man in C beliebige Objekte, sogar einfache 
Datentypen wie Zeichenketten oder gar "nichts" werfen kann.
1
if (...) throw "nicht erlaubt";
2
if (...) throw -1;
3
if (...) throw;

Das kommt mir sehr seltsam vor.

Gehe ich in der Annahme richtig, dass die drei oben gezeigten Zeilen 
schlechter Programmierstil sind?
Ist das eine rhetorische Frage?

Was passiert bei deinem Fall 1, wenn der aufrufende
Code so aussieht?
1
try {
2
  // do something silly to get throw "nicht erlaubt";
3
} catch(int i) { // ???
4
}

Ich würde immer nur Objekte eigener Klassen
werfen, diese immer von einer gemeinsamen
Basisklasse ableiten und weitere Basisklassen in
die Vererbungshierarchie einziehen, um dedizierte
Fälle abzufangen.

Siehe https://en.cppreference.com/w/cpp/error/exception

merciless
Dirk K. schrieb:
> Was passiert bei deinem Fall 1, wenn der aufrufende
> Code so aussieht?

Was soll passieren? Genau das, was man erwartet...

Stefan ⛄ F. schrieb:
> Gehe ich in der Annahme richtig, dass die drei oben gezeigten Zeilen
> schlechter Programmierstil sind?

Die dritte Zeile hat ihre Berechtigung, die ersten beiden sind halt wie 
alles in C++: Kann man machen, muß man aber nicht. Du hast die freie 
Wahl, wie du dir das Bein wegschiesst, aus einer unbegrenzten Zahl der 
Möglichkeiten ;)

Oliver
Stefan ⛄ F. schrieb:
> Das kommt mir sehr seltsam vor.
>
> Gehe ich in der Annahme richtig, dass die drei oben gezeigten Zeilen
> schlechter Programmierstil sind?

Ich würde es zumindest nicht machen. Ein Vorteil von Exceptions ist 
doch, dass man sich eine entsprechende Klassenhierarchie aufbauen kann 
und so ein und den selben Fehler auf unterschiedlichen 
Abstraktionsebenen verarbeiten kann.

Oliver S. schrieb:
> Die dritte Zeile hat ihre Berechtigung

Zur Klarstellung: Die dritte Zeile kann man verwenden, um in einem 
Exception-Handler einfach die gefangene Exception weiter zu werfen.
Gast
Oliver S. schrieb:
> die ersten beiden sind halt wie
> alles in C++: Kann man machen, muß man aber nicht. Du hast die freie
> Wahl, wie du dir das Bein wegschiesst, aus einer unbegrenzten Zahl der
> Möglichkeiten

Damit hast du mein Bauchgefühl bestätigt.
Stefan ⛄ F. schrieb:
> Jetzt habe ich gelesen, dass man in C beliebige Objekte, sogar einfache
> Datentypen wie Zeichenketten oder gar "nichts" werfen kann.

Datentypen und Objekte sind unterschiedliche Dinge! Du kannst keinen DT 
werfen. Du kannst nur ein Objekt eines (beliebigen) DT werfen.

Deine dritte Zeile ist ein re-throw.

Und noch etwas: throw-by-value, catch-by-reference. Sonst erleidest Du - 
wie üblich - in einer Klassenhierarchie das sog. Objectslicing.
Gast
Wilhelm M. schrieb:
> Datentypen und Objekte sind unterschiedliche Dinge! Du kannst keinen DT
> werfen. Du kannst nur ein Objekt eines (beliebigen) DT werfen.

Jaja ist schon klar.

Ob Variablen vom Typ int und char[] Objekte sind, darüber streiten sich 
die gelehrten auch wieder. In Java sind es definitiv keine Objekte.
Rolf M. schrieb:
> Stefan ⛄ F. schrieb:
>> Ob Variablen vom Typ int und char[] Objekte sind, darüber streiten sich
>> die gelehrten auch wieder. In Java sind es definitiv keine Objekte.
>
> C++ erbt die Definition des Begriffs "object" von C. Da sind jegliche
> Art von Daten, die im Speicher liegen können, Objekte. Also auch
> Instanzen von int.

Was eigentlich besser zur verstehen ist (42 als Instanz von int), als 
die Java-Variante, die die Basistypen als "minderwertigen" Typ ansieht.
Gast
Carl D. schrieb:
> Rolf M. schrieb:
>> Stefan ⛄ F. schrieb:
>>> Ob Variablen vom Typ int und char[] Objekte sind, darüber streiten sich
>>> die gelehrten auch wieder. In Java sind es definitiv keine Objekte.
>>
>> C++ erbt die Definition des Begriffs "object" von C. Da sind jegliche
>> Art von Daten, die im Speicher liegen können, Objekte. Also auch
>> Instanzen von int.
>
> Was eigentlich besser zur verstehen ist (42 als Instanz von int), als
> die Java-Variante, die die Basistypen als "minderwertigen" Typ ansieht.

Hat man das nicht aus reiner Notwendigkeit gemacht? Wenn jedes int, 
char, etc. ein Objekt in Java wäre und damit der Typ immer abgeleitet 
von der Klasse Object ist, hätte das wahrscheinlich ziemlich die 
Performance gekillt? Könnte man die Instanz in einem Register speichern? 
Dazu müsste man sich wohl die Definition von Object ansehen.
Orakel schrieb:
> Carl D. schrieb:
>> Rolf M. schrieb:
>>> Stefan ⛄ F. schrieb:
>>>> Ob Variablen vom Typ int und char[] Objekte sind, darüber streiten sich
>>>> die gelehrten auch wieder. In Java sind es definitiv keine Objekte.
>>>
>>> C++ erbt die Definition des Begriffs "object" von C. Da sind jegliche
>>> Art von Daten, die im Speicher liegen können, Objekte. Also auch
>>> Instanzen von int.
>>
>> Was eigentlich besser zur verstehen ist (42 als Instanz von int), als
>> die Java-Variante, die die Basistypen als "minderwertigen" Typ ansieht.
>
> Hat man das nicht aus reiner Notwendigkeit gemacht? Wenn jedes int,
> char, etc. ein Objekt in Java wäre und damit der Typ immer abgeleitet
> von der Klasse Object ist, hätte das wahrscheinlich ziemlich die
> Performance gekillt? Könnte man die Instanz in einem Register speichern?
> Dazu müsste man sich wohl die Definition von Object ansehen.

Wobei wir wieder zurück wären bei der Sprache des TO, die damit kein 
Problem hat.
Warum das Java so macht, ist mir schon klar. Nur muß eine Objektinstanz 
nicht notwendigerweise sperriger als ihr Inhalt sein.
Der Grund ist einfach:

in Java sind nicht-primitive DT (also UDT) immer(!) Referenztypen.

in C++ können sowohl primitive wie auch UDT Wert- oder Referenztypen 
sein.

Der Sprachgebrauch in Java ist inkonsequent: ein Referenzwert in einer 
Variablen (Variable = benanntes Objekt) ist auch ein Objekt, wird aber 
so nicht genannt.

Datentyp: Der Datentyp definiert eine Menge von möglichen Werten sowie 
eine Menge von Operationen.

Objekt: Ein Objekt ist ein Speicherbereich, in dem ein Wert des 
gegebenen Datentyps abgelegt ist.

Wert: Ein Wert ist eine Folge von Bits mit einem Datentyp.

Variable: Eine Variable ist ein Objekt mit einem Namen (Bezeichner).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.