Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试着抓住C#我该怎么做?_C#_Variable Assignment - Fatal编程技术网

试着抓住C#我该怎么做?

试着抓住C#我该怎么做?,c#,variable-assignment,C#,Variable Assignment,我正在做一项作业,我现在必须实现Try&Catch方法,也就是在我的程序中捕捉除数字以外的输入。我理解学习手册中的过程和解释,并且在尝试时也做了一些小例子。但是,当我想在我的任务中实现这一点时,我就陷入了困境。有没有人能在庄园里向我解释一下,不要破坏任何东西,而是一路帮助我 这是我的密码: using System; namespace BastunKP { class Program { public static double FahrToCels(double fa

我正在做一项作业,我现在必须实现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;
      }
   }
}
使用系统;
名称空间BastunKP
{
班级计划
{
公共静态双华氏度传感器(双华氏度)
{
回报率(华氏32度)*5/9;
}
公共静态void Main(字符串[]args)
{
控制台写入线(“华氏温度下的Skriv”);
double fahr=Convert.ToDouble(Console.ReadLine());
双温度=华氏度(华氏度);
做
{      
尝试
{
//我不知道在这里写什么。
}
抓住
{
Console.WriteLine(“siffor中的Du kan bara skriva,testa igen”);
}
如果(温度<73)
{
Console.WriteLine(“temperatureenär för kallt,skruva upp lite!”);
}
否则如果(温度>77)
{
Console.WriteLine(“temperatureenär för varmt,skruva ner lite!”);
}
其他的
{
Console.WriteLine(“Temperaturenär nu bra,hoppa in!”);
Console.ReadKey();
}
fahr=Convert.ToDouble(Console.ReadLine());
温度=华氏度(华氏度);
}        
而(tempCels<73 | | tempCels>77);
返回;
}
}
}

检查有效输入不需要
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();

首先,让我们编写代码而不进行任何异常处理。首先要正确掌握基本知识。我们需要一种方法:

  • 向用户询问华氏温度
  • 如果输入不是有效的
    double
    ,请转到1
  • 将该值转换为摄氏度
  • 如果没有,请转到1
  • 如果以摄氏为单位的温度不属于
    (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;
              }
         }
    }
    
    似乎是个嫌疑犯。还有什么可以扔的吗?嗯,没有

    好的,第二个问题:如果
    ToDouble()
    抛出,哪些代码不应该执行?当然,任何取决于
    ToDouble()
    的结果的东西。因此,所有这些代码都会进入
    try

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

    try catch
    想象成一个控制代码执行路径的花式
    if
    :如果代码抛出,请转到
    catch
    如果没有,请在
    try
    块内保持正常执行

    第四个问题:无论发生什么情况,
    try
    catch
    块中的所有内容之后,应该运行什么代码?在您的情况下,什么都没有,但是如果有,它将进入
    finally

    请注意,
    catch
    finally
    块不是必需的。唯一的规则是,在
    try
    块之后必须立即出现其中至少一个
    try catch
    try finally
    try catch finally
    都是有效的

    第五点也是最后一点:您希望处理哪些异常?您应该始终只处理您知道如何处理的异常,而忽略所有其他异常。
    ToDouble
    可以抛出哪些异常?如果您阅读文档,您将看到它可以抛出
    FormatException
    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;
                  }
             }
         }
    } 
    

    好了,我们完成了。

    //不知道在这里写什么。
    不管是什么代码,都可能引发异常。在添加
    try..catch
    之前,考虑一下您计划编写的代码。这是您应该放在
    try
    块中的代码。首先,我认为必须在其中包含代码“double fahr=Convert.ToDouble(Console.ReadLine());”,但这不起作用。请在try之外声明变量。在内部,只需分配值。谢谢!这使得代码工作!但是有一个问题,你从哪里获得catch参数中的“FormatException”和“OverflowException”的名称?@Kian首先,这个答案不是为了“让代码工作”,而是为了让你开始理解在c#中异常处理是如何工作的。简单地让你的代码工作需要一个更短的答案。其次,
    System.FormatException
    System.OverflowException
    是在扩展
    System.Exception
    的框架中实现的类。
    public static double GetTemperatureFromUser()
    {
         while (true)
         {
             Console.Write("Enter temperature in Fahrenheit: ");
             //...
         }
    }
    
    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;
                  }
             }
         }
    } 
    
    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.");
             }
         }
    }