试试Catch C#我该怎么办?

时间:2017-12-27 11:45:53

标签: c# variable-assignment

我正在完成一项任务,现在我必须实施Try& Catch-method也可以捕获程序中除数字之外的输入。我理解我的学习书中的过程和解释,并在尝试时也做了一些小例子。但是当我想把这个实现到我的任务中时,我会陷入困境。有人可以在庄园向我解释,不要破坏任何东西,但一路上试着帮助我吗?

这是我的代码:

using System;

namespace BastunKP
{
  class Program
  {
       public static double FahrToCels(double fahr)
       {
          return (fahr - 32) * 5 / 9;
       }

       public static void Main(string[] args)
       {
          Console.WriteLine("Skriv in Fahrenheit: ");
          double fahr = Convert.ToDouble(Console.ReadLine());
          double tempCels = FahrToCels(fahr);

          do            
          {      
            try               
            {
                //Dont know what to write here.
            }
            catch
            {
                Console.WriteLine("Du kan bara skriva in siffor, testa igen.");
            }

            if (tempCels < 73)
            {
                Console.WriteLine("Temperaturen är för kallt, skruva upp lite!");
            }
            else if (tempCels > 77)
            {
                Console.WriteLine("Temperaturen är för varmt, skruva ner lite!");
            }
            else 
            {
                Console.WriteLine("Temperaturen är nu bra, hoppa in!");
                Console.ReadKey();
            }

            fahr = Convert.ToDouble(Console.ReadLine());
            tempCels = FahrToCels(fahr);              
          }        
          while (tempCels < 73 || tempCels > 77);
          return;
      }
   }
}

2 个答案:

答案 0 :(得分:1)

首先,让我们编写代码而不进行任何异常处理。首先获得基础知识。我们需要一种方法:

  1. 询问用户华氏温度。
  2. 如果输入不是有效double,请转到1.
  3. 将值转换为摄氏度。
  4. 如果没有,请转到1.
  5. 如果摄氏温度不属于(73, 77),请转到1.

    public static double GetTemperatureFromUser()
    {
         while (true)
         {
              Console.Write("Enter temperature in Fahrenheit: ");
              var t = FahrToCels(Convert.ToDouble(Console.ReadLine()));
    
              if (t < 73)
              {
                  Console.Write("Temperature is too low. Try again.");
              }
              else if (t > 77)
              {
                  Console.Write("Temperature is too high. Try again.");
              }
              else
              {
                  return t;
              }
         }
    }
    
  6. 好的,那看起来不错。现在让我们添加一些异常处理。第一个问题:这里可能出现什么问题并抛出异常?

    var t = FahrToCels(Convert.ToDouble(Console.ReadLine()));
    

    似乎是一个可能的嫌疑人。还有什么可以抛出的吗?嗯,没有。

    好的,第二个问题:如果ToDouble()抛出什么代码不应该执行?好吧,任何明显取决于ToDouble()结果的事情。因此,所有代码也都在try块中。

    好的,第三个问题:如果ToDouble()抛出,应该运行什么代码?在我们的例子中,我们应该通知用户输入不是有效的double。好的,该代码需要进入catch块。

    try-catch视为一个控制代码执行路径的花哨if:如果代码抛出,如果没有,请转到catch,继续在{{1}内正常执行阻止。

    第四个问题:无论发生什么,trytry块内的所有其他代码应该运行什么代码?在你的情况下没有,但如果有,它将进入catch块。

    请注意,finallycatch块不是必需的。唯一的规则是至少有一个必须在finally块之后立即出现; trytry-catchtry-finally都有效。

    第五个也是最后一个:你想要处理什么例外?您应该始终只处理您知道如何处理的异常并忽略所有其他异常。 try-catch-finally可以抛出哪些例外?如果您阅读文档,则会看到它可以抛出ToDoubleFormatException。你可以处理它们,因为它们相同:用户输入无效。

    好的,让我们重写一下我们的方法:

    OverflowException循环是否取决于while中发生的任何事情?不,无论内部发生什么,该方法都应该在循环中运行;退出循环的唯一方法是当用户输入有效数字并返回方法时。好吧,ToDouble块超出任何异常处理范围,用户提示符也是如此:

    while

    现在下一条指令是我们的主要嫌疑人,因此它显然必须进入public static double GetTemperatureFromUser() { while (true) { Console.Write("Enter temperature in Fahrenheit: "); //... } } 区块。我们在方法中编写的所有其他内容都取决于try的值,因此我们将所有内容也放在t块中:

    try

    好的,现在我们只是错过public static double GetTemperatureFromUser() { while (true) { Console.Write("Enter temperature in Fahrenheit: "); try { var t = FahrToCels(Convert.ToDouble(Console.ReadLine())); if (t < 73) { Console.Write("Temperature is too low. Try again."); } else if (t > 77) { Console.Write("Temperature is too high. Try again."); } else { return t; } } } } 块。我们将为每个我们知道如何处理的异常添加一个:

    catch

    你去了,我们已经完成了。

答案 1 :(得分:0)

没有必要try/catch来检查有效输入。您可以使用double.TryParse;

Console.WriteLine("Skriv in Fahrenheit: ");
double fahr;
double tempCels;
bool isInputCorrect = false;
while (!isInputCorrect)
{
    var input = Console.ReadLine();
    if (!double.TryParse(input, out fahr))
    {
        Console.WriteLine("Du kan bara skriva in siffor, testa igen.");
        continue;
    }
    tempCels = FahrToCels(fahr);
    if (tempCels < 73)
    {
        Console.WriteLine("Temperaturen är för kallt, skruva upp lite!");
        continue;
    }
    else if (tempCels > 77)
    {
        Console.WriteLine("Temperaturen är för varmt, skruva ner lite!");
        continue;
    }
    isInputCorrect = true;
}
Console.WriteLine("Temperaturen är nu bra, hoppa in! tempCels : " + tempCels);
Console.ReadKey();

如果你坚持使用try/catch,你可以尝试这样做;

只需替换double.TryParse部分。

var input = Console.ReadLine();
try
{
    fahr = Convert.ToDouble(input);
}
catch (Exception e)
{
    Console.WriteLine("Du kan bara skriva in siffor, testa igen.");
    continue;
}