mikrocontroller.net

Forum: PC-Programmierung Exception werfen in C++


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht 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.
if (...) throw "nicht erlaubt";
if (...) throw -1;
if (...) throw;

Das kommt mir sehr seltsam vor.

Gehe ich in der Annahme richtig, dass die drei oben gezeigten Zeilen 
schlechter Programmierstil sind?

: Bearbeitet durch User
von Dirk K. (merciless)


Bewertung
0 lesenswert
nicht lesenswert
Ist das eine rhetorische Frage?

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

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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht lesenswert
oder ... 0 / 42;

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.