try-catch frage
-
Folgender Code gibt kein "fehler" aus. Stattdessen wird im debug auf die fehlerhafte Zeile angezeigt. Warum?
#include <iostream> using namespace std; int main() { try { cout << "start" << endl; int b = 0; int a = 5 / b; } catch (...) { cout << "fehler" ; } cin.get(); }
-
Weil die Division erst zur Laufzeit ausgewertet wird, das muss der Compiler nicht bemängeln. Sobald der Code etwas komplexer wird, kann er das auch gar nicht mehr.
Nächstes Mal kannst du uns aber gleich auf die fehlerhafte Zeile hinweisen statt lauter irrelevante Dinge wie
try-catchund Includes mitzuschleppen.
-
Hm? wenn ich auf release kompiliere kommt da auch gar kein catch.
Es geht darum, dass ich ein einfaches Beispiel mit try und catch testen will.#include <iostream> using namespace std; int main() { try { cout << "start" << endl; int b = 0; int a = 5 / b; // hier sollte der fehler sein cout << a; } catch (...) { cout << "fehler" ; } cin.get(); }der code ist ein bißchen von da kopiert
http://www.willemer.de/informatik/cpp/exceptions.htm
-
xBlackKnightx schrieb:
Es geht darum, dass ich ein einfaches Beispiel mit try und catch testen will.
Tja, nur dass Division durch Null in C++ keine Exception wirft.
Wenn du eine "echte" Exception auslösen willst (du könntest schließlich auch einfach selber ein throw machen), kannst du ja mal versuchen mit new ein wahnsinnig großes Array (viel größer als dein Rechner Speicher hat) zu erzeugen.
-
Tja ich denke mal das division by zero etwas ist, was das Betriebssystem verwaltet und nicht die Laufzeitumgebung!
Ich weiß das unter Linux solche dinge per signals vom Betriebssystem an das Programm gesendet wird und man kann solche Signals halt nur über Signal Handler abfangen.
C++ ist nicht JAVA
-
Hier gabs schonmal eine Diskussion darüber.
http://www.c-plusplus.net/forum/161198
Es gibt wohl Compiler die bei Division durch 0 eine Exception werfen.
-
Wenn man ein zusätzliches if verkraften kann, dann kann man das natürlich auch so machen:
try { int a = 3; int b = 0; int c; if ( b == 0 ) // Werfe hier eine exception else c = a / b; // Hier natürlich aufpassen mit Integer-Division } catch ( ... ) { // Fehlermeldung }
-
ja hab so gemacht
if ( b == 0) throw 1;auch gut
-
xBlackKnightx schrieb:
ja hab so gemacht
if ( b == 0) throw 1;auch gut
Wenn du das an mehreren Stellen im Code brauchst lohnt es sich eventuell eine eigene Exceptionklasse zu erstellen.
Geht ganz leicht wenn man von exception ableitet.Jenachdem halt.
-
Braunstein schrieb:
Es gibt wohl Compiler die bei Division durch 0 eine Exception werfen.
Jein. Das Ganze nennt sich SEH (oder VEH) und braucht Compilersupport, aber der größte Teil der Arbeit wird vom Betriebssystem getan (verfügbar nur unter Windows) - Integer-Division durch 0 erzeugt eine Trap, d.h. der Prozess selbst hat erst mal nicht mehr die Kontrolle. Meines Wissens beherrscht das nur MSVC, wenn bestimmte Compilerschalter gesetzt werden.
Man muss dazu sagen, dass es notgedrungen kein wirklich verlässlicher Mechanismus ist. Wenn man beispielsweise einen Segfault kriegt, besteht die Wahrscheinlichkeit, dass man sich vorher schon andere Teile des Speichers zerschossen hat und einen Laufzeitfehler gar nicht mehr vernünftig behandeln kann.
-
Ich halte Exceptions bei Logikfehlern für eine schlechte Idee. Eine Division durch Null darf in einem korrekten Programm nie auftreten. Man kann eine solche Ausnahme nicht sinnvoll behandeln, denn der Nenner hätte gar nie erst 0 sein dürfen. Das einzig Vernünftige ist also den Bug zu fixen. Daher würde ich wenn überhaupt zu
assertgreifen. "Wenn überhaupt", da moderne Debugger wahrscheinlich ebenso wieassertsofort anhalten, wenn durch Null dividiert wird.Mir ist durchaus bewusst, dass Benutzereingaben o.Ä. zu einer Null führen können, aber die Korrektheit sollte meiner Meinung nach direkt beim Einlescode geprüft werden und nicht erst bei Berechnungen.
-
Nexus schrieb:
Mir ist durchaus bewusst, dass Benutzereingaben o.Ä. zu einer Null führen können, aber die Korrektheit sollte meiner Meinung nach direkt beim Einlescode geprüft werden und nicht erst bei Berechnungen.
Das geht aber nur, wenn der eingegebene Wert mehr oder minder direkt dort auftaucht. Wenn komplexere mathematische Umrechnungen vorkommen geht das nicht mehr so einfach (Numerik, iterative Algorithmen etc.).
Exception sind aber auch hier eher selten die Lösung.
-
Ich frage mich wieso überhaupt eine Null in eine Variable einschleichen kann ^^
In meiner Philosophie wäre das x mal teilen also z.b: die fünf 3 mal Teilen = in 4 Stücken = 1,25. Wenn ich den Kuchen 3 mal teile, habe ich auch 4 Stücke.
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)
...Aber der Divisor heisst "in x Stücken" wenn schon 0 dann wäre das im umgangssprachlichen Ausdruck "in 0 Stücken" 5 / 0 = 0
Ist die Funktion Division eigentlich intern im Prozessor eingebaut oder ist das auch eine Programmierung?
Wobei dass schnell am try-catch Thema vorbeigeht, sorry...
-
Übersehe ich da einen Smiley oder ist mein Ironiedetektor sonstwie kaputt?
-
xBlackKnightx schrieb:
Ich frage mich wieso überhaupt eine Null in eine Variable einschleichen kann ^^
In meiner Philosophie wäre das x mal teilen also z.b: die fünf 3 mal Teilen = in 4 Stücken = 1,25. Wenn ich den Kuchen 3 mal teile, habe ich auch 4 Stücke.
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)
...Das kannst du schon so definieren. Dann musst du aber auch eine komplett andere Algebra darauf aufbauen, wenn du damit rechnen willst.

Hatte darüber mal eine lange Diskussion mit meiner Gastmutter in Australien. Die hat mir das auch nicht geglaubt, dass Division durch 0 nicht 0 (oder die Ursprungszahl) gibt (respektive nicht so definiert ist). ^^Ist die Funktion Division eigentlich intern im Prozessor eingebaut oder ist das auch eine Programmierung?
Kommt auf den Prozessor drauf an. Kann sein, muss aber nicht. Division braucht relativ viel Hardware.
//Edit:
Zum Glück gibt es eine exakte Definition, wie die Division definiert ist. Und die braucht keinen (missverständlichen) Text dazu.
-
Zu deiner Philosophie:
Die Division ist die Umkehrfunktion der Multiplikation. Und wie willst du das multiplizieren mit 0 umkehren? Das geht nicht, es existiert keine sinnvolle Umkehrung ==> die Division durch 0 ist nicht definiert.Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.
Je nach Hardwarearchitektur hast du dann ein anderes instruction set. In deiner IA32-Architecture hast du bestimmt einen multiplier.
Diese Hardwareinstruktionen sind mit elektronischen Schaltkreisen implementiert.*Edit
Mist, ging ja um Division und nicht um Multiplikation ^^
-
icarus2 schrieb:
Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.Wobei das ein nicht-exklusives "oder" ist oder wie addierst du 2 und 3 lediglich mit Multiplikation?

Adder sind so saugünstig. Die entstehen fast von alleine. ^^
-
drakon schrieb:
icarus2 schrieb:
Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.Wobei das ein nicht-exklusives "oder" ist oder wie addierst du 2 und 3 lediglich mit Multiplikation?

Adder sind so saugünstig. Die entstehen fast von alleine. ^^
Och, ich drücke mich heute mal wieder unverständlich aus ^^
Ich meinte man braucht entweder einen Adder oder einen Multiplier, um Multiplikationen durchzuführen.
Für Additionen nimmt man natürlich immer einen Adder
Aber man hat nicht immer einen Multiplier.*Edit
@ Drakon
Hattet ihr eine spezifische Architektur in der Digitech? Wir verwenden die MIPS Architektur.
-
icarus2 schrieb:
*Edit
@ Drakon
Hattet ihr eine spezifische Architektur in der Digitech? Wir verwenden die MIPS Architektur.Wir hatten MRC. Wurde von Wirth designt und von Lisa Liu (gab bei uns neben Capkun Digitech) implementiert auf dem Board.
-
xBlackKnightx schrieb:
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)Und da 5 * 0 ja wieder schön 5 ergibt, macht das Ganze auch wunderbar Sinn.
Übrigens, 5/1 = 5 und 5/2 = 2.5... Durch x dividieren heisst nicht "x mal teilen" sondern "in x Stücke teilen". Und du kannst den Kuchen nicht in 0 Stücke teilen, mindestens eins hast du immer. Nur so...
-
Nexus schrieb:
xBlackKnightx schrieb:
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)Und da 5 * 0 ja wieder schön 5 ergibt, macht das Ganze auch wunderbar Sinn.
Übrigens, 5/1 = 5 und 5/2 = 2.5... Durch x dividieren heisst nicht "x mal teilen" sondern "in x Stücke teilen". Und du kannst den Kuchen nicht in 0 Stücke teilen, mindestens eins hast du immer. Nur so...
Du versteht das nicht.
Wir denken:
20 Bier und 5 Leute => 20/5=4 => Jeder kriegt 4 Bier.Er denkt:
20 Bier und 5 Leute => 20 mit vier äquidistanten Teilungspaapstreifenseparatierungsabstandshaltertrennelementen dazwischen => Jeder kriegt 4 Bier.Beide Denken sind gleichwertig.
Aber er hat kein Problem mit der Teilung durch 0, weil sie bei ihm nicht vorkommen kann.
Wir:
cin>>bier;
cin>>leute;
return bier/leute;//throws if leute==0Er:
cin>>bier;
cin>>leute;
unsigned int teilungen=leute-1;//throws if leute==0
return teilungsgrößebeisovielen(bier,teilungen)//nothrow