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(inti){// ???
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.
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.
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.
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.
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.
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).
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.