如何处理 DivideByZeroException

How to handle DivideByZeroExeption

我正在用 C# 编写控制台计算器。我的问题是我不知道如何以正确的方式处理 DivideByZeroExeption。我希望用户有机会将不正确的“0”更改为另一个数字。这应该发生在同一个计算中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Program
    {
        //Program Start
        public static void Main(string[] args)
        {   
            //jaNein String um zu ermitteln ob erneut eine Rechnung gestellt werden soll
            //Der Operator wird in den rechenzeichen String eingelesen
            string jaNein, rechenzeichen = (null);
            //Start der Rechnerschleife
            do {

                int zahl_1 = Convert.ToInt32(null); //erste Zahl einlesen
                zahl_1 = (Fehlerklasse.fehlerzahl_1(zahl_1)); //erste Zahl weitergeben

                rechenzeichen = (Fehlerklasse.fehlerRechenzeichen(rechenzeichen)); //rechenzeichen einlesen

                int zahl_2 = Convert.ToInt32(null); //zeite Zahl einlesen
                zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2)); //zweite Zahl weitergeben

                var ergebnis = Ergebnis.rechenmethode(zahl_1, zahl_2, rechenzeichen); 
                Console.WriteLine(ergebnis); //ergebnis wird ausgelesen


                Console.WriteLine("Möchten sie erneut eine Rechnung stellen ? (ja / nein)"); //Frage an den Benutzer

                //Start einer schleife zur Ermittlung von jaNein
                do
                {          
                    jaNein = Console.ReadLine();
                    if (!(jaNein == "ja" | jaNein == "nein"))
                    { 
                        Console.WriteLine("Ungültige Antwort, bitte wählen sie (ja / nein)");
                    }
                }
                while (!(jaNein == "ja" | jaNein == "nein")); //löscht alles geschriebene in der Konsole

                Console.Clear();
            }

            while (jaNein == "ja"); //Führe die Rechnerschleife aus, solange jaNein "ja" ist
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Rechner
    {
        //Implementieren der Klasse Fehlerklasse
        Fehlerklasse fehlerbehen = new Fehlerklasse();
        //Methode zum Plusrechnen
        public int plus(int zahl_1, int zahl_2)
        {
            return zahl_1 + zahl_2;
        }
        //Methode zum Minusrechnen
        public int minus(int zahl_1, int zahl_2)
        {
            return zahl_1 - zahl_2;
        }
        //Methode zum Malrechnen
        public int mal(int zahl_1, int zahl_2)
        {
            return zahl_1 * zahl_2;
        }
        //Methode zum Geteiltrechnen
        public int geteiltdurch(int zahl_1, int zahl_2)
        {          
           if(zahl_2!= 0)
            {             
                return zahl_1 / zahl_2;
            }     
           else
            {
                Console.WriteLine("Die Division durch 0 ist verboten!");
                return zahl_2;
            }


        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Ergebnis
    {
        //Methode zur Ermittlung des Operators
        public static int rechenmethode(int zahl_1, int zahl_2, string rechenzeichen)
        {

          //var ergebnis auf 0 gesetzt
            var ergebnis = 0;
            //Klassen rechnen und Fehlerklasse implementiert
            Rechner rechnen = new Rechner();
            Fehlerklasse fehlerbehen = new Fehlerklasse();
            //Switchanweisung zur Ermittlung des Operators
            switch (rechenzeichen)
            {
                case "+":
                    ergebnis = rechnen.plus(zahl_1, zahl_2);

                    break;
                case "-":
                     ergebnis = rechnen.minus(zahl_1, zahl_2);

                    break;
                case "*":
                     ergebnis = rechnen.mal(zahl_1, zahl_2);

                    break;
                case "/":
                    ergebnis = rechnen.geteiltdurch(zahl_1, zahl_2);
                    break;
            }
            //Gibt die Variable ergebnis zurück
            return ergebnis;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Fehlerklasse
    {

        //Methdoe zum Sicherstellen dass zahl_1 eine Zahl ist
        public static int fehlerzahl_1(int zahl_1)

        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    zahl_1 = Convert.ToInt32(Console.ReadLine());
                    tryAgain = false;
                }
                catch (FormatException)

                {
                    Console.WriteLine("Geben sie eine gültige Zahl ein!");
                }
                catch (OverflowException)
                {
                    Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!");
                }
            }
            return zahl_1;
        }
        //Methdoe zum Sicherstellen dass zahl_2 eine Zahl ist
        public static int fehlerzahl_2(int zahl_2)

        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    zahl_2 = Convert.ToInt32(Console.ReadLine());
                    tryAgain = false;
                }
                catch (FormatException)
                {
                    Console.WriteLine("Geben sie eine gültige Zahl ein!");
                }
                catch (Exception )
                {
                    Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!");
                }
            }
            return zahl_2;
        }
        //Methode um zu verhindern dass andere Zeichen als +,-,*,/ als Operator verwendet werden
        public static string fehlerRechenzeichen (string rechenzeichen)
        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    rechenzeichen = Console.ReadLine();
                   switch (rechenzeichen)
                    {
                        case "+":
                            break;
                        case "-":
                            break;
                        case "*":
                            break;
                        case "/":
                            break;
                        default:
                            throw new FormatException();
                    }
                    tryAgain = false;
                }
                catch (FormatException)
                {
                    Console.WriteLine("Geben sie ein gültiges Rechenzeichen ein! (+,-,*,/)");
                }
            }
            return rechenzeichen;
        }


    }
}

在检索 "rechenzeichen" 和 "zahl_2" 的地方只需围绕这部分代码进行操作,以便您可以检查第二个数字是否与运算符兼容。

var avoidedDivideByZero = false;
do
{
    int zahl_2 = Convert.ToInt32(null);
    zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2));

    if(rechenzeichen != @"/" || zahl_2 != 0)
    {
        avoidedDivideByZero = true;
    }
    else
    {
        Console.WriteLine(@"Cannot divide by 0, please enter another number.");
    }
}
while(!avoidedDivideByZero)

我想我已经理解了 "zahl_2" 和 "rechenzeichen" 的意思。我会将其重构为一个单独的方法,这样它就不会因检查而使您的主循环混乱,但应该允许您立即继续。

如果我正确理解您的问题,您只是想防止除法运算中的除数为 0 的情况,并在这种情况下提示用户输入新的除数。这可以通过在初始输入时进行检查来处理,或者您可以像这样调整除法:

//Methode zum Geteiltrechnen
        public int geteiltdurch(int zahl_1, int zahl_2)
        {          
           if(zahl_2!= 0)
            {             
                return zahl_1 / zahl_2;
            }     
           else
            {
                Console.WriteLine("Die Division durch 0 ist verboten!");
                Console.Write("Please enter another divisor: ");
                zahl_2 = Convert.ToInt32(Console.ReadLine());
                //You'll want to do some validation here.
                return geteiltdurch(zahl_1, zahl_2);
            }
        }

您也可以使用 while 循环做类似的事情。最终,最好在调用除法之前检查 0——这样你就不需要重复检查输入是否为数字等。基本逻辑是相同的——编写提示并读取输入,直到获得有效的非零输入。