Forum: PC-Programmierung Exception werfen in C++


von Stefan F. (Gast)


Lesenswert?

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?

von Dirk K. (merciless)


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

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

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

oder ... 0 / 42;

von Stefan F. (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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.

von Orakel (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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).

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> Wert: Ein Wert ist eine Folge von Bits mit einem Datentyp.

Die Folge von Bits ist nicht der Wert, sondern eine Repräsentation des 
Werts.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.