试着抓住C#我该怎么做?
即时工作的任务,我现在必须实施尝试&捕捉方法也赶上我的程序中的数字以外的输入。我理解我学习过程中的过程和解释,并在尝试时做了一些小例子。但是当我想把这个工作贯彻到我的任务中时,我陷入了困境。有人可以在庄园里向我解释,不要破坏任何东西,只是试图帮助我一路?试着抓住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;
}
}
}
回答:
首先,让我们编写没有任何异常处理的代码。首先获得基本知识。我们需要一种方法:
- 询问用户的华氏温度。
- 如果输入不是有效的
double
,请转至1. - 将该值转换为摄氏度。
- 如果没有,去1
如果摄氏温度不属于
(73, 77)
去1public 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
块内正常执行。
第四个问题:无论发生什么情况,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;
}
}
}
}
好了,现在我们只缺少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.");
}
}
}
然后你走了,我们完成了。
回答:
没有要求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;
}
以上是 试着抓住C#我该怎么做? 的全部内容, 来源链接: utcz.com/qa/264767.html