试试Catch C#我该怎么办?

问题描述 投票:1回答:2

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

这是我的代码:

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;
      }
   }
}
c# variable-assignment
2个回答
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; } } }

好的,那看起来不错。现在让我们添加一些异常处理。第一个问题:这里可能出现什么问题并抛出异常?

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

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

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

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

try-catch视为控制代码执行路径的奇特if:如果代码抛出,如果没有则转到catch,继续在try块内正常执行。

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

请注意,catchfinally块不是强制性的。唯一的规则是,在try区块之后必须立即出现其中至少一条; try-catchtry-finallytry-catch-finally都是有效的。

第五个也是最后一个:你想要处理什么例外?您应始终只处理您知道如何处理和忽略所有其他异常的异常。 ToDouble会抛出什么例外?如果您阅读文档,您将看到它可以抛出FormatExceptionOverflowException。你可以处理这两个因为它们相同的东西:和无效的用户输入。

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

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区块。我们将为每个我们知道如何处理的异常添加一个:

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 (FormatException)
         {
              Console.Write("Invalid number format. Try again.");
         }
         catch (OverflowException)
         {
              Console.Write("Number is too large or too small. Try again.");
         }
     }
} 

你走了,我们完成了。


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.