试试 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;
}
首先,让我们编写没有任何异常处理的代码。先打好基础。我们需要一种方法:
- 询问用户华氏温度。
- 如果输入无效
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;
}
}
}
好的,看起来不错。现在让我们添加一些异常处理。第一个问题:这里会出现什么问题并抛出异常?
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
中发生的任何事情?不,无论内部发生什么,该方法都应该 运行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.");
}
}
}
到此为止,我们完成了。
我正在做一项作业,我现在必须在我的程序中实现 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;
}
首先,让我们编写没有任何异常处理的代码。先打好基础。我们需要一种方法:
- 询问用户华氏温度。
- 如果输入无效
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; } } }
好的,看起来不错。现在让我们添加一些异常处理。第一个问题:这里会出现什么问题并抛出异常?
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
中发生的任何事情?不,无论内部发生什么,该方法都应该 运行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.");
}
}
}
到此为止,我们完成了。