c#Taschenrechner Ausnahmen definieren (try catch)



  • Ich verstehe irgendwie nicht ganz wie ich Ausnahmen definieren kann. Mein Script sieht bisher wie folgt aus :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication10
    {
        public partial class Mein_erster_Taschenrechner : Form
        {
            public Mein_erster_Taschenrechner()
            {
                InitializeComponent();
            }
    
            private void textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Eingabefeld2.Text = string.Empty;//<-Entweder so 
                Ergebnisfeld.Text = "";//<-oder so
                Eingabefeld1.Text = "";
                Addition.Checked = false;
                Subtraktion.Checked = false;
                Multiplikation.Checked = false;
                Division.Checked = false;
            }
    
            private void button9_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 0;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 0;
                }
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
    
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 1;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 1;
                }
            }
    
           [highlight] private void radioButton1_CheckedChanged(object sender, EventArgs e)
            {
                try
                {
    
                }
                catch (Exception)
                {
                    throw;
                }[/highlight]
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                double zahl1 = Convert.ToDouble(Eingabefeld1.Text);
                double zahl2 = Convert.ToDouble(Eingabefeld2.Text);
                if (Addition.Checked == true)
                {
                    double ergebnis = zahl1 + zahl2;
                    Ergebnisfeld.Text = Convert.ToString(ergebnis);
                }
                else if (Subtraktion.Checked == true)
                {
                    double ergebnis = zahl1 - zahl2;
                    Ergebnisfeld.Text = Convert.ToString(ergebnis);
                }
                else if (Multiplikation.Checked == true)
                {
                    double ergebnis = zahl1 * zahl2;
                    Ergebnisfeld.Text = Convert.ToString(ergebnis);
                }
                else if (Division.Checked == true)
                {
                    double ergebnis = zahl1 / zahl2;
                    Ergebnisfeld.Text = Convert.ToString(ergebnis);
                }
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 2;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 2;
                }
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 3;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 3;
                }
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 4;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 4;
                }
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 5;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 5;
                }
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 6;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 6;
                }
            }
    
            private void button12_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 7;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 7;
                }
            }
    
            private void button11_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 8;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 8;
                }
            }
    
            private void button10_Click(object sender, EventArgs e)
            {
                if (!Addition.Checked && !Subtraktion.Checked && !Multiplikation.Checked && !Division.Checked)
                {
                    Eingabefeld1.Text += 9;
                }
                else if (Addition.Checked || Subtraktion.Checked || Multiplikation.Checked || Division.Checked)
                {
                    Eingabefeld2.Text += 9;
                }
            }
    
            private void Division_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Subtraktion_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
        }
    }
    

    Kann mir vielleicht jemand das hier für einen Buchstaben vordefinieren. Ich möchte nämlich dass er keine Buchstaben akzeptiert und eine Meldung ausgibt wo drin steht "nicht möglich"



  • Entschuldigung ich hab leider ein falschen BB-code benutzt.
    Das [highlight][/highlight] steht natürlich nicht im Script



  • So ich habs geschafft , dass er keine Buchstaben mehr akzeptiert.

    private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    double zahl1 = Convert.ToDouble(Eingabefeld1.Text);
                    double zahl2 = Convert.ToDouble(Eingabefeld2.Text);
                    if (Addition.Checked == true)
                    {
                        double ergebnis = zahl1 + zahl2;
                        Ergebnisfeld.Text = Convert.ToString(ergebnis);
                    }
                    else if (Subtraktion.Checked == true)
                    {
                        double ergebnis = zahl1 - zahl2;
                        Ergebnisfeld.Text = Convert.ToString(ergebnis);
                    }
                    else if (Multiplikation.Checked == true)
                    {
                        double ergebnis = zahl1 * zahl2;
                        Ergebnisfeld.Text = Convert.ToString(ergebnis);
                    }
                    else if (Division.Checked == true)
                    {
                        double ergebnis = zahl1 / zahl2;
                        Ergebnisfeld.Text = Convert.ToString(ergebnis);
                    }
                }
                catch
                {
                    Ergebnisfeld.Text = "Ungültig";
                }
            }
    

    Aber wie mach ich die DivideByZero Ausnahme. Da hab ich jetzt echt keine Ahnung.



  • Erweitere den catch-Block für alle Ausnahmen, auch DivideByZero

    catch(Exception ex)
    {
       MessageBox.Show("Fehler   " + ex.Message);
       return;
    ]
    


  • Du kannst einfach mit regulären Ausdrücken arbeiten, um nur Zahlen als Eingabe zu erlauben:

    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
       Regex nurZahlen = new Regex("[0-9]");
       if (nurZahlen.IsMatch(e.KeyCode.ToString()))
       {
          e.SuppressKeyPress = false;
       }
       else
       {
          e.SuppressKeyPress = true;
       }
    }
    

    Oder etwas kürzer noch:

    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
       Regex nurZahlen = new Regex("[0-9]");
    
       e.SuppressKeyPress = nurZahlen.IsMatch(e.KeyCode.ToString());   
    }
    

    Die Regex-Deklaration würde ich aber nicht in der Methode selbst machen, die hab ich nur da jetzt reingeschrieben, dass man sieht, dass sie gebraucht wird.



  • Regex ist ja schön und gut, aber wenn, dann richtig. Weil das Regex "[0-9]" akzeptiert auch "1ab" 😉
    Ich würde hier Regex aber dennoch nicht einsetzen.



  • Hm, kann ich so nicht nachvollziehen. Eine damit versehene Textbox akzeptiert ausschließlich Zahlen als Eingabe. Ich sehe da also keinen Fehler im Regex. Welche Alternativen Möglichkeiten gäbe es denn noch?



  • Sorry, hab vorhin übersehen, dass es im Keydown-event gemacht wird. Dann "funktioniert" es. Was man dann allerdings nicht eingeben kann, sind Fließkommazahlen 😉 Oder Dinge wie 2e-3, was durchaus auch legitim ist.
    Das aber nur als Einwurf, warum ich Regex hier nicht für ideal halte und warum es mit Regex sehr schnell sehr kompliziert wird.

    Ob ein String eine Fließkommazahl ist, kannst du mit double.TryParse herausfinden. Imo der bessere Ansatz als Regex.



  • Das ist natürlich richtig. Alternativ lässt sich der Regex anpassen, was aber für Anfänger (das typische Taschenrechner-Projekt halt 😉 ) schnell kompliziert werden kann. Geb dir also Recht, wenns darum geht, schnell was unkompliziertes hinzubekommen. Mit steigendem Wissen wird man aber auch schnell schreibfaul und arbeitet irgendwann mit Regex 😃



  • Ich bin - abgesehen von der Thematik hier - eh kein übergroßer Regex-Fan. Als ich es frisch gelernt hatte, war ich total begeistert.. "boah, so viel Funktionalität in nur einem String" 😃
    Aber inzwischen habe ich das meiste an Regex aus meinen Programmen wieder entfernt. Der Grund ist einfach: Man schaut irgendwann mal wieder drauf und dann geht's erstmal los mit dem fröhlichen Entziffern des Regex 😃
    Es gibt Fälle wo Regex das Mittel der Wahl ist. Aber viele Programmierer - inkl. mir früher - erliegen der Versuchung an falschen Stellen und das ist dann imo mies für die Wartbarkeit des Programms. Regex korrekt hinkriegen, am Besten nach mit Lookbehind/Lookahead, das ist schon so eine Sache.


Log in to reply