Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 28.01.2021
Сообщений: 8

Перехват исключений try-catch

09.02.2021, 17:53. Показов 1688. Ответов 29

Студворк — интернет-сервис помощи студентам
Привет!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main()
        {
            try
            {
                Console.WriteLine("Enter any number:");
                int user_input = Convert.ToInt32(Console.ReadLine());                
                Console.WriteLine("Well done!");
            }
            catch (FormatException)
            {
                Console.WriteLine("Wrong format! It's not a number. Try again.");             
             }
        }
Задача: нужно, запрашивать снова у пользователя ввести число до тех пор, пока он этого не сделает, т.е. повторять код снова. Как это можно сделать?

Заранее спасибо за помощь и внимание!)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2021, 17:53
Ответы с готовыми решениями:

Обработка исключений Конструкция try.catch.finally
Добрые день, помогите пожалуйста Вводится время в текстбоксе(например 22:23) и в отдельном текстбоксе вводятся минуты Вывести какое...

Перехват ошибок try-catch
В общем, нужно перехватить ошибки, через try-catch, как я понимаю, в моем случае, ошибка возможна при вводе не правильного параметра строки...

Обработка исключений try - catch при сканировании каталога
Напишите программу, которая сканирует некоторую папку (задаётся пользователем) с учётом поддиректорий, все хранящиеся в ней файлы...

29
454 / 278 / 163
Регистрация: 17.04.2019
Сообщений: 1,637
09.02.2021, 18:03
Natalo,
C#
1
2
3
4
5
6
7
8
int user_input = 0;
        
Console.Write("Enter any number: ");
while (!Int32.TryParse(Console.ReadLine(), out user_input))
{
    Console.WriteLine("Wrong format! It's not a number. Try again.");
    Console.Write("Enter any number: ");
}
0
0 / 0 / 0
Регистрация: 28.01.2021
Сообщений: 8
09.02.2021, 18:06  [ТС]
Нее, нужно использовать именно try-catch )
0
454 / 278 / 163
Регистрация: 17.04.2019
Сообщений: 1,637
09.02.2021, 18:14
Natalo, а разве сложно немного подумать и переделать данный пример?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int userInput = 0;
bool isInputValid = true;
        
do
{
    try
    {
        isInputValid = true;
        Console.Write("Enter any number: ");
        userInput = Int32.Parse(Console.ReadLine());
    }
    catch (FormatException)
    {
        isInputValid = false;
        Console.WriteLine("Wrong format! It's not a number. Try again.");
    }
}
while (!isInputValid);
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
09.02.2021, 18:16
это не правильное применение, исключения надо ловить и обрабатывать тогда, когда ты сам не можешь никак повлиять на правильность работы кода, например, хост не доступен, файл занят или битый и т.д., а такие вещи нужно проверять, например, как ProgItEasy показал
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
09.02.2021, 19:08
Если красота кода не важна - goto спешит на помощь
1
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
09.02.2021, 19:17
А мне кажется с goto здесь самое красивое решение. Хотя да, многие не поддержат

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
            int userInput;
        repeat:
            try
            {
                Console.Write("Enter any number: ");
                userInput = Int32.Parse(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Wrong format! It's not a number. Try again.");
                goto repeat;
            }
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
09.02.2021, 20:29
самое красивое это валидация без выброса исключений
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
09.02.2021, 21:08
Цитата Сообщение от Diamante Посмотреть сообщение
самое красивое это валидация без выброса исключений
Скорее всего учебное задание по теме try-catch.
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
09.02.2021, 23:04
Pilarentes, goto - никогда не был элегантным решением. Если только речь не идёт об assembler. Всё потому что нужно глазами выискивать метки, и держать в голове. А если их несколько в одном месте, то вообще мрак.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    Console.WriteLine("Enter any number:");
                    int user_input = int.Parse(Console.ReadLine());
                    break;
                }
                catch (FormatException)
                {
                    Console.WriteLine("Wrong format! It's not a number. Try again.");
                }
            }
            Console.WriteLine("Well done!");
        }
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
09.02.2021, 23:49
Цитата Сообщение от Bespridelschic Посмотреть сообщение
А если их несколько в одном месте, то вообще мрак
Как в прочем и с вложенными циклами. В данном конкретно примере goto нисколько не напрягает
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
10.02.2021, 00:08
Цитата Сообщение от Bespridelschic Посмотреть сообщение
goto - никогда не был элегантным решением
Вечный цикл тоже не назовёшь "элегантным решением".
Надо в коде разбирать логику и искать условия выхода.
Что, на мой взгляд, ещё хуже чем goto.

Добавлено через 1 минуту
Один из вариантов решения "Запрещённый" goto
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
10.02.2021, 09:05
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вечный цикл тоже не назовёшь "элегантным решением".
Надо в коде разбирать логику и искать условия выхода.
Выход из while (true) может быть только с помощью return и break, что гораздо проще искать чем метку. Плюс цикл ограничен телом, что добавляет читаемости из-за видимых границ.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
10.02.2021, 09:11
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Выход из while (true) может быть только с помощью return и break, что гораздо проще искать чем метку.
Если делать "элегантно", то условие выхода из цикла должно явно прописываться в while(...).
А без этого выбор между whilе(true) и goto - дело вкуса.
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
10.02.2021, 13:18
Почему не использовать?
C#
1
while (!int.TryParse())
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
10.02.2021, 13:54
Цитата Сообщение от Masson1848 Посмотреть сообщение
Почему не использовать?
Потому, что перед каждым вводом нужно сначала вывести сообщение.
Для совмещения этого в одной команде надо добавить дополнительный метод.
Что и реализовано мною по ссылке в сообщении № 12.

Добавлено через 47 секунд
Код из ссылки:
C#
1
2
3
4
5
6
7
8
9
10
static bool TryInputDouble(string message, out double numeric)
{
     Console.Write(message);
     return double.TryParse(Console.ReadLine(), out numeric)
}
 
----------------
     -----------------
      while(!TryInputDouble("Введите значение а: ", out double a))
             Console.WriteLine("Ошибка ввода!!! Повторите ввод !!!");
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
10.02.2021, 14:30
А так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        static void Main(string[] args)
        {
            GetDataFromUser();
        }
 
        static void GetDataFromUser()
        {
            Console.WriteLine("Enter a number");
            var data = Console.ReadLine();
 
            DoSomething(data);
        }
 
        static void DoSomething(string data)
        {
            try
            {
                var i = int.Parse(data);
                Console.WriteLine("Success!");
            }
            catch (Exception)
            {
 
                Console.WriteLine("Input error");
                GetDataFromUser();
            }
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
10.02.2021, 14:34
Цитата Сообщение от escoult Посмотреть сообщение
А так?
Я бы не советовал использовать рекурсия особенно там где проще реализовать без неё.
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
10.02.2021, 14:35
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я бы не советовал
Где там рекурсия?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
10.02.2021, 14:41
Цитата Сообщение от escoult Посмотреть сообщение
Где там рекурсия?
1) Main
2) GetDataFromUser
3) DoSomething
4) DoSomething - catch - к пункту 2.

Добавлено через 2 минуты
Если делать, то лучше так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        static void Main(string[] args)
        {
            GetDataFromUser();
        }
 
        static void GetDataFromUser()
        {
            do
            {
                Console.WriteLine("Enter a number");
                var data = Console.ReadLine();
 
            } while(DoSomething(data));
        }
 
        static bool DoSomething(string data)
        {
            try
            {
                var i = int.Parse(data);
                Console.WriteLine("Success!");
                return false;
            }
            catch (Exception)
            {
 
                Console.WriteLine("Input error");
                // GetDataFromUser();
                return true;
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.02.2021, 14:41
Помогаю со студенческими работами здесь

Какая нужна директива для работы исключений catch?
Вот как-то неожиданно, при использовании try - catch, оказалось, что нужная директива не подключена, и невозможно указать тип исключений....

Обработка всех типов исключений в одном блоке catch
Пардон если не разглядел сам, но поиски постоянно ведут на конструкции try { // код программы...

Многоуровневый перехват исключений
1) Создать генератор псевдо случайных целых чисел в диапазоне находящемся за пределами допустимых значений для типа данных short. 2)...

Простой перехват исключений
Добрый вечер, помогите, пожалуйста, сделать 1) Создать целочисленный массив из количества элементов равному 21. 2) Заполнить массив...

Обработка некорректного ввода, используя механизм исключений и блок Try-Catch
Есть код Нужно сделать так, что бы после некорректного ввода(например System.FormatException или System.OverflowException и тд )...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru