Ausnahmebehandlung DivideByZeroException
-
Hallo
ich habe einen Programm das sich mit dem Thema Try-Catch bzw. Ausnahmebehandlung arbeitet. Das Programm ist ein einfacher Taschenrechner, zwei Steuelemente bzw. Textboxes werden an eine Methode übergeben, die inhalte von der Textboxes sollen vor irgendwelche Berechnungen wie z.B. Addition, Subtraktion, Multiplikation und Division geprüft werden. Der inhalt sollen auf Konvertierungsfehler geprüft und dem entsprechend gemeldet. Alles läuft einwandfrei, ich habe nur ein Problem mit Division bzw. Division durch Null. Als Datentyp werden Single verwendet und beim Ausnahmebehandlung wird die (DivideByZeroException^) nicht angenommen.
Ich habe, was ich dachte, eine lösung gehabt allerdings es haut nicht hin. Hier ist der Code:
private: System::Void buttonBeeneden_Click(System::Object^ sender, System::EventArgs^ e) { Close(); } Void check(TextBox ^wert1,TextBox ^wert2) { //Vereinbarung von Variablen Single zahl1, zahl2, ergebnis = 0; //Eigene Ausnahme erzeugen //throw gcnew Exception("Eine Division durch Null wurde versucht"); //Prüfe nach eine ungültige eingabe bzw. Konvertierungsfehler try { zahl2 = Convert::ToSingle(wert2->Text); try { zahl1 = Convert::ToSingle(wert1->Text); } catch (FormatException^) { MessageBox::Show("Bei der Konvertierung von Zahl 1 ist ein Fehler passiert " + wert1); wert1->Select(); } } catch (FormatException^) { MessageBox::Show("Bei der Konvertierung von Zahl 2 ist ein Fehler passiert " + wert2); wert2->Select(); } if (radioButtonDivision->Checked == true) { try { zahl2 = safe_cast<Int32>(Convert::ToSingle(wert2->Text)); try { zahl1 = safe_cast<Int32>(Convert::ToSingle(wert1->Text)); } catch (DivideByZeroException^) { MessageBox::Show("Zahl 1 hat den Wert Null " + wert1); wert1->Select(); } } catch (DivideByZeroException^) { MessageBox::Show("Zahl 2 hat den Wert Null " + wert2); wert2->Select(); } } } private: System::Void buttonBerechnen_Click(System::Object^ sender, System::EventArgs^ e) { //Steuerelement TextBox an eine Methode übergeben check(textBoxZahl1,textBoxZahl2); }
Ich habe vier radioButtons für die entsprechende Rechnungoperation, bei der Division sieht man dass ich einen Casting durchgeführt habe, weil die Datentyp als Single definiert sind, habe ich die kurz in Int32 umgewandelt, mit ganzzählige Typen gilt die DivideByZeroException aber hier läuft es nicht ganz.
Kann jemand mir eine Tipp geben wie ich mit dem Division für Typ Single umgehen kann, ich habe auch eigene Ausnahmen probiert, leider ohne erfolg.
Danke.
-
Kev36 schrieb:
Kann jemand mir eine Tipp geben wie ich mit dem Division für Typ Single umgehen kann, ich habe auch eigene Ausnahmen probiert, leider ohne erfolg.
Doku lesen hilft:
Dividing a floating-point value by zero will result in either positive infinity, negative infinity, or Not-a-Number (NaN) according to the rules of IEEE 754 arithmetic. Floating-point operations never throw an exception.
Quelle: http://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx
-
Außerdem kannst du eine Exception auch nur dann fangen, wenn du sie im richtigen Code-Teil einbaust. Da du in deiner Check-Methode ja gar keine Division durchführst, kriegst du dort natürlich auch niemals eine DivideByZeroException (gilt wie theta schon schrieb, natürlich nur für ganze Zahlen (int, short, long, ...).
D.h. also, daß du in deiner Check-Methode einfach überprüfen mußt, ob der Nenner Null (0) ist...
-
Danke für die Hilfe, ich habe das Program jetzt fertig und möchte zeigen wie ich das gelöst habe.
private: System::Void buttonBeeneden_Click(System::Object^ sender, System::EventArgs^ e) { //Programm beenden Close(); } Single Berechnen(Single x, Single y) { //Variable für das Ergebnis die Berechnung Single ergebnis = 0; //Je nach dem was Berechnet wird if (radioButtonAddition->Checked == true) ergebnis = x + y; if (radioButtonSubtraktion->Checked == true) ergebnis = x - y; if (radioButtonMultiplikation->Checked == true) ergebnis = x * y; if (radioButtonDivision->Checked == true) ergebnis = x / y; return (ergebnis); } Void check(TextBox ^wert1,TextBox ^wert2) { //Vereinbarung von Variablen Single zahl1, zahl2 = 0; //Prüfe ob ein Ausnahme stattfindet Boolean ausnahme = false; //Prüfe nach eine ungültige eingabe bzw. Konvertierungsfehler und Division durch Null try { zahl2 = Convert::ToSingle(wert2->Text); //Wenn Division wird nach dem Wert geprüft if (radioButtonDivision->Checked == true) if (zahl2 == 0) { MessageBox::Show("Zahl 2 hat einen Null Wert " + wert2 + " Division durch Null geht nicht"); wert2->Select(); ausnahme = true; } try { zahl1 = Convert::ToSingle(wert1->Text); if (radioButtonDivision->Checked == true) if (zahl1 == 0) { MessageBox::Show("Zahl 1 hat einen Null Wert " + wert1 + " Division durch Null geht nicht"); wert1->Select(); ausnahme = true; } } catch (FormatException^) { //Wenn kein Zahl eingegeben wird sondern ein Buchstabe MessageBox::Show("Bei der Konvertierung von Zahl 1 ist ein Fehler passiert " + wert1); wert1->Select(); ausnahme = true; } } catch (FormatException^) { MessageBox::Show("Bei der Konvertierung von Zahl 2 ist ein Fehler passiert " + wert2); wert2->Select(); ausnahme = true; } //Wenn die ausnahme nicht stattgefunden hat, dann Berechnungen durchführen if (ausnahme == false) labelErgebnis->Text = Convert::ToString(Berechnen(zahl1,zahl2)); } private: System::Void buttonBerechnen_Click(System::Object^ sender, System::EventArgs^ e) { //Steuerelement TextBox an eine Methode übergeben check(textBoxZahl1,textBoxZahl2); }
Ich habe das soeben fertig geschrieben, und durch gestestet. Ich bin begeistert.