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. 🙂


Anmelden zum Antworten