Управление исключением формата без блоков try-catch

#c# #try-catch #formatexception

#c# #try-catch #formatexception

Вопрос:

Есть ли какой-либо способ перехватить исключение формата здесь, кроме использования try-catch инструкции? Если пользователь вводит что-либо большее, чем один символ, это выдает исключение формата. Это мой код:

 public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = Convert.ToChar(Console.ReadLine());
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Convert.ToChar(Console.ReadLine());
    }
    if (playOrNot == 'Y' || playOrNot == 'y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    if (char.ToUpper(playornot) != 'Y' amp;amp; char.ToUpper(playornot) != 'N')
        return false;
    return true;
}
 

Комментарии:

1. Почему вы char все равно используете? Вы могли бы использовать строку, возвращенную Console.ReadLine непосредственно из.

Ответ №1:

Есть несколько вариантов.

1 Вместо этого используйте строки:

 public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    string playOrNot = Console.ReadLine();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.ReadLine();
    }
    if (playOrNot.ToUpper() == "Y")
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(string playornot)
{
    return !"YN".Contains(playOrNot);
}
 

2 Используйте консоль.Ключ для чтения:

 public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = Console.ReadKey();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.ReadKey();
    }
    if (char.ToUpper(playOrNot) == 'Y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    return !"YN".Contains(char.ToUpper(playOrNot));
}
 

3 Используйте простой метод для получения символа из строки чтения:

 public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = GetChar();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.GetChar();
    }
    if (char.ToUpper(playOrNot) == 'Y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    return !"YN".Contains(char.ToUpper(playOrNot));
}
public char GetChar()
{
    string line = Console.ReadLine();
    if (line.Length == 1)
        return line[0]; // first char of line
    return (char)0;
}
 

Ответ №2:

Вместо того чтобы полагаться на исключения для потока управления, вы всегда должны стараться избегать их в первую очередь. В вашем случае вы могли бы сделать это, используя Read вместо ReadLine . Таким образом, вы читаете только один символ:

 Console.WriteLine("Would you like to play RPS? y/n");
char playOrNot = Convert.ToChar(Console.Read());
while(!validateChoice(playOrNot))
{
    Console.WriteLine("Invalid! please re-enter selection");
    playOrNot = Convert.ToChar(Console.Read());
}
 

Комментарии:

1. этот ответ правильный, но вторая строка чтения () должна быть преобразована в Read()

2. @MohammadRasouli Да, спасибо за подсказку.