当用户键入一个字符串而不是整数时,它会给我和错误并导致控制台崩溃。我不明白如何捕捉到这个错误。如果发生此错误,我想要它做的是跳过播放器。
{{1}}
答案 0 :(得分:4)
切勿在用户输入上使用Convert.ToInt32
请改用Int.TryParse
这是vexing exception.
Vexing 例外是不幸的设计决策的结果。在完全非特殊情况下抛出异常情况,因此必须始终抓住并处理。
一个令人烦恼的异常的典型例子是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
一样令人烦恼,应该避免。
经验法则是不要对使用代码轻松检查的事物使用例外 - 例外是针对特殊事物 - 主要是您可以在代码中控制的事情,例如网络可用性和类似的事情 - 以及用户输入{ {1}}而不是12
根本不是例外。
直接回答你的问题,
您没有发现异常的原因是因为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);
}
答案 1 :(得分:1)
您的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);
}
答案 2 :(得分:0)
尝试检查值类型,然后再将其传递给您想要执行的操作。
string line = Console.ReadLine();
int value;
if (int.TryParse(line, out value))
{
Console.WriteLine("Integer here!");
}
else
{
Console.WriteLine("Not an integer!");
}
如果值为int,则会返回!! 如果它是一个int,继续你想要的任何东西,否则,再次使用。