3 回答
TA贡献1835条经验 获得超7个赞
永远不要Convert.ToInt32在用户输入上使用。
使用Int.TryParse来代替。
这是一个令人烦恼的例外的完美例子。
令人烦恼的异常是不幸的设计决策的结果。恼人的异常是在完全非异常的情况下抛出的,因此必须一直被捕获和处理。
令人烦恼的异常的经典示例是 Int32.Parse,如果给它一个无法解析为整数的字符串,它就会抛出异常。但是此方法的 99% 用例是转换用户输入的字符串,这可能是任何旧事物,因此解析失败绝不是例外。
Convert.ToInt32接受字符串作为参数的重载只是int.Parse在内部调用-请参阅它的源代码:
public static int ToInt32(String value) {
if (value == null)
return 0;
return Int32.Parse(value, CultureInfo.CurrentCulture);
}
因此它和使用一样令人烦恼int.Parse,应该避免。经验法则是不适合的东西,你可以很容易地通过检查代码中使用的例外-例外是特殊的东西-主要的东西,你不能在你的代码控制,如网络的可用性和类似的东西-与用户输入adsf的,而不是12IS一点也不例外。
直接回答您的问题,
您没有捕获异常的原因是因为您Convert.ToInt32不在try块内。
要真正捕获异常,您的代码应该如下所示:
Console.Write("Row (1-3): ");
int UserRowChoice = 0;
try
{
UserRowChoice = Convert.ToInt32(Console.ReadLine());
}
catch (InvalidCastException e) { ThrowError("You typed a string instead of an integer. You've lost your turn."); Console.ReadKey(); RunGame(T1, CurrentPlayer, Winner); }
if (UserRowChoice < 1 || UserRowChoice > 3)
{
ThrowError("You either typed a number that was less than 1 or greater than 3. You've lost your turn.");
Console.ReadKey();
RunGame(T1, CurrentPlayer, Winner);
}
但是,正如我之前写的,不要使用Convert.ToInt32-int.TryParse而是使用:
Console.Write("Row (1-3): ");
int UserRowChoice = 0;
if(int.TryParse(Console.ReadLine(), out UserRowChoice))
{
if (UserRowChoice < 1 || UserRowChoice > 3)
{
ThrowError("You either typed a number that was less than 1 or greater than 3. You've lost your turn.");
Console.ReadKey();
RunGame(T1, CurrentPlayer, Winner);
}
}
else
{
ThrowError("You typed a string instead of an integer. You've lost your turn.");
Console.ReadKey();
RunGame(T1, CurrentPlayer, Winner);
}
TA贡献1834条经验 获得超8个赞
您的try块没有围绕可能引发InvalidCastException. 试试这个:
Console.Write("Row (1-3): ");
int UserRowChoice;
try
{
UserRowChoice = Convert.ToInt32(Console.ReadLine());
}
catch (InvalidCastException e) { ThrowError("You typed a string instead of an integer. You've lost your turn."); Console.ReadKey(); RunGame(T1, CurrentPlayer, Winner); }
if (UserRowChoice < 1 || UserRowChoice > 3)
{
ThrowError("You either typed a number that was less than 1 or greater than 3. You've lost your turn.");
Console.ReadKey();
RunGame(T1, CurrentPlayer, Winner);
}
TA贡献1860条经验 获得超9个赞
在将值类型传递给您想要执行的任何操作之前,请尝试检查该值类型。
string line = Console.ReadLine();
int value;
if (int.TryParse(line, out value))
{
Console.WriteLine("Integer here!");
}
else
{
Console.WriteLine("Not an integer!");
}
如果值是否为 int ,这将返回!如果它是一个int,继续你想要的任何东西,否则,再次询问使用。
- 3 回答
- 0 关注
- 144 浏览
添加回答
举报