Die "Try" "Catch" Methode
-
Guten Tag zusammen ! Ich bin neu in der Welt von C++ und lerne mit dem C++ Builder 6 und dem dazugehörigem Buch (4. Auflage für Kids).
Nun zu meiner Frage.
Ich habe in einem Kapitel gelernt, wie ich die Try und Catch Methode anwende. Als Aufgabe soll ich diese nun in einem altem Projekt ausüben.
Dieses Projekt ist ein Taschenrechner wo eine Fehlermeldung auftritt, wenn man durch Null teilt. Ich habe die Methode so angewendet, bekomme aber eine "kleine" Fehlermeldung.(Der Code für den Button, wo man dividiert):
void __fastcall TForm1::Button4Click(TObject *Sender)
{ try
{
Ergebnis = Zahl1 / Zahl2 ;
Label3->Caption =
"Ergebnis des Divison: " ;
Label4 -> Caption = FloatToStrF (Ergebnis, ffNumber, 8,2) ;
}
catch (...)
{ Label4->Caption = " Division durch Null nicht mögich " ; }
}Meiner Meinung nach ist das richtig, die Fehlermeldung lautet :
[Linker Fehler] Unresolved external '__fastcall TForm1::Label5Click(System::TObject *)' referenced from C:\(Gespeicherter Ordner)Muss ich bei catch (...) in die Klammern den Fehlertyp hinzufügen oder reichen die Punkte ? Bei dem letztem Projekt reichten die Punkte, aber ist das hier anders weil es sich nur den Teilungsfehler bezieht ? Wenn ja, wie heißt dieser Fehlertyp? Müsste ich um den Namen rauszubekommen den Fehler hervorrufen damit mir der Builder den Namen "ausspuckt" ?

Mfg AnfängerSchreiber
Vielen Dank im Vorraus !
-
Ein Teilen durch 0 führt in C++ grundsätzlich nicht zum Auslösen einer Exception, sondern zu undefiniertem Verhalten. Bei IEEE-Floats ist das Verhalten zwar definiert, eine Exception wird per Default aber ebenfalls nicht geworfen.
Was du da versuchst, funktioniert in der Form mit C++ nicht. Du musst also selbst den Divisor auf 0 überprüfen und dann mit throw eine Exception werfen.
Die Fehlermeldung sieht hingegen nach einem völlig anderen Problem aus.
-
Kauf dir bitte ein anderes Buch zum Lernen. C++ für Kids ist eines der schlechtesten Bücher.
-
Das hat jetzt aber eigentlich nichts mit der Fehlermeldung zu tun. Ich hab den C++ Builder nie benutzt, aber entweder spinnt der verwendete Linker komplett, oder der Fehler hat nichts mit dem try...catch zu tun, sondern den hast du schon früher gemacht - halte ich für wahrscheinlicher.
-
Der Fehler ist doch offensichtlich. Die Funktion TForm1::Label5Click wurde deklariert aber nicht definiert.
Es stellt sich überhaupt die Frage, warum du GUIs verwendest. Gerade für die Grundlagen bieten sich die Konsolen doch an, weil man einen einfachen, übersichtlichen Code hat und sich so nur um das Problem kümmern kann.
Allgemein bezweifel ich, dass du den Code überhaupt verstehst.Mit wenigen Ausnahmen werden Exceptions nie automatisch ausgelöst, sondern werden in Funktionen verwendet, um einen unerwarteten Abbruch auszulösen, und entsprechende Reaktionen zuzulassen.
Du könntest z.B. eine Funktion definieren, die so aussieht:
#include <stdexcept> int divide(int divisor, int dividend) { if (dividend==0) throw std::invalid_argument("Division durch 0"); return divisor/dividend; };Hierbei kann jeder Typ "geworfen" werden, es bietet sich aber an, entsprechende spezialisierte Klassen zu haben. Im Standart wird die Klasse std::exception als Basis verwandt und davon werden viele andere abgeleitet.
Die drei Punkte können verwendet werden, um alle Typen anzufangen, aber dann kannst du nicht auf weitere Daten zugreifen. Man kann dadurch auch bestimmte Fehler abgreifen, andere aber durchlassen.Beispiel:
try { int zahl = divide(Zahl1, Zahl2); } catch (std::invalid_argument& e) // nur diese Art von Fehlern { std::cout<<"Ungültiger Parameter: "<<e.what()<<"\n"; } catch (std::exception& e) { // Allgemeine Fehlermeldungen (invalid_argument würde // dazugehören, aber wurde bereits abgefangen) std::cout<<"Fehlermeldung : "<<e.what()<<"\n"; } catch (...) // Andere Fehler { std::cout<<"anderer Fehler\n"; }
-
Ein Teilen durch 0 führt in C++ grundsätzlich nicht zum Auslösen einer Exception, sondern zu undefiniertem Verhalten.
Bei Fließkommazahldivisionen wird da meistens ein SIGFPE ausgelöst, und den kann man mit entsprechender Funktion handeln.