【问题标题】:if-statement inside a try-catch block returns "Infinite"try-catch 块中的 if 语句返回“Infinite”
【发布时间】:2021-12-25 13:00:13
【问题描述】:

首先,我是编程新手,刚刚完成了关于 C# 的 SoloLearn 课程。 我确实了解 try-catch 块的核心原理,但我不知道如何在我的代码中正确实现这一点(代码如下所示)。

class Program
{
    static void Main(string[] args)
    {   //create object of Class Calculator
        Calculator calc = new Calculator();

        //take user input and store in num1 and print it to screen
        try{
            double num1 = Convert.ToInt32(Console.ReadLine());
            Console.Write("\nnumber1: " + num1);
            double num2 = Convert.ToInt32(Console.ReadLine());
            Console.Write("\nnumber2: " + num2);
        
            //take operator as input and print it to screen
            string operand = Console.ReadLine();
            Console.Write("\noperator: " + operand);

            //check if operator from user input is equal to one of the 4 calculation methods in Calculator Class
            Console.Write("\nresult: ");
            if(operand == "+"){
            Console.WriteLine(calc.Addition(num1, num2));
            }
            else if(operand == "-"){
            Console.WriteLine(calc.Subtraction(num1, num2));
            }
            else if(operand == "*"){
            Console.WriteLine(calc.Multiplication(num1, num2));
            }
            else{
            Console.WriteLine(calc.Division(num1, num2));
            }
        }
        catch(DivideByZeroException){
            Console.WriteLine("can't divide by zero");
        }
        catch(Exception e){
            Console.WriteLine("An error occurred. Only integers are allowed!");
        } 
    }
}//class Calculator with methods for 4 simple calculations
class Calculator{
    private double number1;
    private double number2;
    private double res;

    public double Addition(double num1, double num2){
        this.number1 = num1;
        this.number2 = num2;
        this.res = num1 + num2;
        return res;
    }
    public double Subtraction(double num1, double num2){
        this.number1 = num1;
        this.number2 = num2;
        this.res = num1 - num2;
        return res;
    }
    public double Multiplication(double num1, double num2){
        this.number1 = num1;
        this.number2 = num2;
        this.res = num1 * num2;
        return res;
    }
    public double Division(double num1, double num2){
        this.number1 = num1;
        this.number2 = num2;
        this.res = num1 / num2;
        return res;
    }
}

所以我希望我的简单计算器能够处理异常“DivideByZero”和“异常 e”-> 如果输入不是整数。

当我使用示例输入 4/0 测试 DivideByZero 异常时,程序返回“Infinite”作为结果,而不是来自 catch 块的代码。

我猜“无限”结果来自 try-catch 块中的 if 语句,但我不确定。

我搜索了多个站点,stackoverflow 上的类似帖子,并阅读了有关 c# 的有关 try-catch 块的 Microsoft 文档,但我就是想不通。

对不起,如果我的代码示例太大,但我认为这是理解我的代码混乱的最佳方式。

提前感谢您的快速回复!

【问题讨论】:

  • 除以0doubles定义的,不会抛出异常。如果您真的希望它输出“不能被零除”,您可以手动检查除数是否为0。
  • 所以不需要第一个catch块,而是我可以使用另一个if语句来检查输入是否等于0?

标签: c# try-catch


【解决方案1】:

更改片段

 else {
   Console.WriteLine(calc.Division(num1, num2));
 }

进入

 else {
  Console.WriteLine(num2 != 0 
     ? $"{calc.Division(num1, num2)}" 
     :  "can't divide by zero");
}

由于浮点除法不会抛出异常而是返回NaNPositiveInfinityNegativeInfinity

 0.0 / 0.0 == double.NaN
 1.0 / 0.0 == double.PositiveInifinity
-1.0 / 0.0 == double.NegativeInfinity 

【讨论】:

    【解决方案2】:

    您的 try catch 没有任何问题。如果将double 除以零,则不会出现异常。在您的情况下,您会得到 Double.PositiveInfinityDivideByZeroException 仅针对整数或十进制数据类型抛出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2018-10-14
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多