为什么不能捕捉这个错误

时间:2018-06-07 20:44:46

标签: c# error-handling

当用户键入一个字符串而不是整数时,它会给我和错误并导致控制台崩溃。我不明白如何捕捉到这个错误。如果发生此错误,我想要它做的是跳过播放器。

{{1}}

3 个答案:

答案 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,继续你想要的任何东西,否则,再次使用。