2017-12-27 74 views
1

即时工作的任务,我现在必须实施尝试&捕捉方法也赶上我的程序中的数字以外的输入。我理解我学习过程中的过程和解释,并在尝试时做了一些小例子。但是当我想把这个工作贯彻到我的任务中时,我陷入了困境。有人可以在庄园里向我解释,不要破坏任何东西,只是试图帮助我一路?试着抓住C#我该怎么做?

这里是我的代码:

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; 
     } 
    } 
} 
+1

'//不知道该怎么写here.'无论代码是_might_抛出异常。 _在你添加'try..catch'之前,想想你打算编写的代码。这是你应该把里面的'try' block._ – mjwills

+0

首先,我认为我必须有代码的代码“双法尔= Convert.ToDouble(到Console.ReadLine());”在那里,但那是行不通的。 – Kian

+0

在try之外声明你的变量。在里面,只需分配值。 – Magnetron

回答

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-catch,try-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

谢谢!这使代码工作!有一个问题,你在哪里获得catch参数中的“FormatException”和“OverflowException”的名字?所有的 – Kian

+0

@Kian首先,这个答案并不意味着“使代码工作”,其意思是让你开始了解异常处理在C#中是如何工作的。简单地使你的代码工作将需要更短的答案。其次,'System.FormatException'和'System.OverflowException'是在扩展'System.Exception'的框架中实现的类。 – InBetween

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; 
} 
+0

谢谢你的评论,但由于我的任务需要我使用try/catch-method,所以我必须让它工作。 – Kian

+0

你是否甚至懒得读这个问题?他*应该*使用'try-catch'。 – InBetween

+0

@InBetween,“我现在要实现的尝试和捉住方法太赶比我的节目数量等投入”你是怎么从这个句子理解? – lucky