whtmst
@whtmst
https://band.link/whtmst

Новичок в C# / Правильно ли я написал вывод ошибки?

Доброго времени друзья. Возможно вопрос банальный и его не следует задавать, но мне хотелось бы услышать мнение людей которые разбираются в C#. Я новичок, только недавно начал изучать язык, прошел урок где показали способ поймать ошибку и вывести ее пользователю. Решил добавить этот способ в свое первое консольное приложение, которое делал до этого. В нем пользователь должен был ввести число от 1 до 5. Тогда я смог реализовать только цикл, что если введенное число было больше 5 или равно 0, то программа просила еще раз ввести число от 1 до 5 и так до бесконечности, пока пользователь это не сделает. Но была проблема в том что если вводить в консоль не число, а какой то символ или строку, то приложение выдавало ошибку FormatException и это было не гуд :(
И узнав немного о том как ловить ошибки и выводить их пользователю, я решил дополнить свое консольное приложение.
Вот код:
static void Main(string[] args)
        {
            int number_user1 = 0;
            bool repeat = true;


            while (repeat)
            {

                try
                {
                    Console.Write("Player 1 write number from 1 to 5: ");
                    number_user1 = Convert.ToInt32(Console.ReadLine());
                    while (number_user1 > 5 || number_user1 == 0)
                    {
                        Console.Write("ERROR: Player 1 PLEASE write number from 1 to 5: ");
                        number_user1 = Convert.ToInt32(Console.ReadLine());
                    }
                }

                catch (FormatException format_ex)
                {
                    Console.WriteLine("Enter only NUMBERS from 1 to 5");
                }

                if (number_user1 <= 5 && number_user1 != 0)
                {
                    repeat = false;
                }

                else
                {
                    repeat = true;
                }

            }

            Console.ReadKey();
        }
Хотелось бы узнать, правильно ли я построил логику захвата ошибки, ее вывода и т.п. (если что проверил, все работает, просто хотелось бы узнать мнение)
  • Вопрос задан
  • 1496 просмотров
Решения вопроса 2
@Smilleey
Вот чуть покрасивее и покороче:
namespace TosterApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int input;
            do Console.WriteLine("Enter number between 0 and 5:");
            while (!int.TryParse(Console.ReadLine(), out input) || input <= 0 || input > 5);
            Console.WriteLine($"You entered {input}");
        }
    }
}
Ответ написан
@seamen
программист любитель
else
                {
                    repeat = true;
                }

этот блок не нужен, можно удалить, так как если условие if не выполняется, то repeat = true.
И в блоке try в цикле while не нужна строка
number_user1 = Convert.ToInt32(Console.ReadLine());

И цикл while в блоке try поменяй на условие if
try
                {
                    Console.Write("Player 1 write number from 1 to 5: ");
                    number_user1 = Convert.ToInt32(Console.ReadLine());
                    if (number_user1 > 5 || number_user1 == 0)
                    {
                        Console.Write("ERROR: Player 1 PLEASE write number from 1 to 5: ");
                    }
                }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
arxont
@arxont
C# программист
Добрый день.
0. Блок if-else надо помещать в блок try. Так как зачем сравнивать если произошла ошибка?
1. В вашем случае лучше использовать ReadKey, так как по условию один символ от 1 до 5.
2. Желательно использовать блок finally, но в вашем случае не обязательно.
3. На мой взгляд много лишних проверок

Обработка ошибок в принципе реализована правильно, но надо помнить, что это достаточно тяжелая операция и в данном случае избыточная. В данном случае можно проверять через TryParse. Я бы решил так -

static void Main()
{
   int number_user1 = 0;

   while (true)
   {
      Console.Write("Player 1 write number from 1 to 5: ");

      string inputChar = Console.ReadKey().KeyChar.ToString();

      if(int.TryParse(inputChar, out number_user1) && number_user1 <= 5 && number_user1 > 0)
      {
         break;
       }
       else
       {
          Console.WriteLine($"\nEnter only NUMBERS from 1 to 5 (you input {inputChar})");
       }
    }

   Console.WriteLine($"\nYou input {number_user1}");
   Console.Write("Press any key to close"); Console.ReadKey();
}


Также почитайте - https://docs.microsoft.com/en-us/dotnet/standard/e...
https://habrahabr.ru/post/221723/
https://habrahabr.ru/post/178805/
и
https://stackoverflow.com/questions/14973642/how-u...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы