试试 Catch C# 我该怎么做?

Try Catch C# How Do I do it?

我正在做一项作业,我现在必须在我的程序中实现 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;
      }
   }
}

不需要 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;
}

首先,让我们编写没有任何异常处理的代码。先打好基础。我们需要一种方法:

  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 中发生的任何事情?不,无论内部发生什么,该方法都应该 运行ning 在一个循环中;退出循环的唯一方法是当用户输入有效数字和方法 returns 时。好的,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.");
         }
     }
} 

到此为止,我们完成了。