0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
1

Обработка пользовательских исключений (Console Application)

18.07.2016, 10:25. Показов 2642. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
День добрый, уважаемые форумчане!

Прошерстила гугл, насколько смогла, но ответа на свой вопрос так и не нашла.

Есть у меня проект, в котором я впервые использовала пользовательские исключения. Т.к. тело Main() содержит бесконечный цикл (программа работает по типу командной строки), то в случае неверно введенных данных мне нужно не завершать всю программу целиком, а завершить только эту итерацию. Потому в случае передачи невалидных значений экземпляру некоторого класса выбрасывается пользовательское исключение, ктр я ловлю в теле Main() и таким образом завершаю итерацию цикла while(true).

Так вот, есть у меня 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
32
33
34
35
36
37
38
39
40
public class Data1
    {
        //...
        public Data1(string str1, string str2)
        {
            if (str1 != string.Empty)
            {
                //
            }
            else
            {
                throw new EmptySettingsException();
            }
 
            if (str2 != string.Empty)
            {
                //
            }
            else
            {
                throw new EmptySettingsException();
            }
        }
        //...
    }
public class Data2
    {
        //...
        public Data2(string filename)
        {
            if (filename != string.Empty)
            {
                //
            }
            else
            {
                throw new EmptyFilenameException();
            }
        //...
    }


В теле Main() имеем:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static void Main(string[] args)
        {
            while (true)
            {
                //..
                try
                {
                    Data1 data1 = new Data1(str1, str2);
                    Data2 data2 = new Data2(filename);
                    //..
                }
                catch (EmptyFilenameException)
                {
                    Console.WriteLine("Filename cannot be empty.\n");
                }
                catch (EmptySettingsException)
                {
                    Console.WriteLine("Settings cannot be empty.\n");
                }
            }
        }


Так вот: EmptyFilenameException отлавливается, в консоль выводится сообщение "Filename cannot be empty.". При возникновении EmptySettingsException среда тыкает меня носом в строку
C#
1
throw new EmptySettingsException();
и утверждает, что исключение данного типа не обрабатывается в коде пользователя. Тела исключений стандартные (взято из MSDN), ничего кроме строки сообщения в исключение не передается. В чем корень проблемы?

P.S. В программе 7 типов пользовательских исключений, соответственно, в Main() 7 блоков catch(). Обрабатываются все, кроме указанного выше, причем вызываются исключения и в конструкторах, и в public и private методах классов.

P.P.S. Если по неопытности опустила какую-то значимую конкретику - напишите, я добавлю информацию.

Заранее всем спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2016, 10:25
Ответы с готовыми решениями:

Обработка пользовательских исключений
работаю с матрицами. создал пользовательский класс исключений, но не знаю теперь как их отловить ...

OpenFileDialog В Console Application
Вечер добрый. Помогите пожалуйста, хочу вывести диалог выбора файлов в консольной программе, но...

Console Application background color
Здравствуйте. Хотелось бы выяснить, как задать цвет фона для всей консоли, т.к....

Создание нового Console Application
У меня есть программа(назовём её file.exe) в которую передаются параметры, потом они записываются в...

13
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,542
18.07.2016, 10:51 2
Kasmann, исключение EmptySettingsException может выбрасываться твоим кодом вне блока try\catch?
0
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
18.07.2016, 10:59  [ТС] 3
Usaga, оно так и выбрасывается - в теле if() без try/catch. Как и некоторые другие исключения
0
Эксперт .NET
17684 / 12870 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
18.07.2016, 12:17 4
Kasmann, ткните курсор на имя исключения в том месте, где оно выбрасывается и нажмите F12.
Потом ткните курсор на имя исключения в том месте, где оно перехватывается и снова нажмите F12.
Если каждый раз вас перенесет в разные файлы/участки кода, то вы по ошибке создали два исключения с одинаковым именем, но в разных пространствах имен, в итоге выбрасывая одно исключение, а перехватывая совсем другое.
1
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
19.07.2016, 00:05  [ТС] 5
kolorotur, из throw и из catch переход идет к одному определению. У меня вообще весь проект в одном файле, ибо маленький, так что ошибиться с дублированием исключений я не могла. Изменила имя исключения на другое, полагая, что могла повторить уже существующее исключение среды, но и это не помогло. Какие еще могут быть варианты?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
19.07.2016, 00:09 6
Не понял, какого поведения вы ждете, если вы выбрасываете ошибку throw new EmptySettingsException, что по вашему должно произойти?
0
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
19.07.2016, 00:24  [ТС] 7
kolorotur, убрала все блоки catch с разными видами исключений, поставила один
C#
1
2
3
4
catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
В итоге обрабатываются все исключения, кроме EmptySettingsException...

Добавлено через 8 минут
Все оказалось гораздо проще, надо было внимательнее читать MSDN. Исключение выбрасывалось из конструктора, который вызывался внутри try. Соответственно, до catch это исключение не доходило. Вынесла создание экземпляра класса за пределы try/catch, все ловится.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
19.07.2016, 00:25 8
Исключения должны располагаться от частного к общему
0
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
19.07.2016, 00:26  [ТС] 9
DataPlanner, прерывание текущей итерации бесконечного цикла, который является основой тела Main(). И вывод сообщения об исключении в консоль. Вопрос уже решен
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
19.07.2016, 00:32 10
Цитата Сообщение от Kasmann Посмотреть сообщение
прерывание текущей итерации бесконечного цикла
Тогда и надо было внутри цикла ошибку выкидывать, т.к. контекст ошибки только текущий луп
0
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
19.07.2016, 00:32  [ТС] 11
DataPlanner, я в курсе. Для проверки я убрала вообще все частные исключения, оставив только общее. И написала об этом прямо и по-русски
0
Эксперт .NET
17684 / 12870 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
19.07.2016, 02:02 12
Лучший ответ Сообщение было отмечено Kasmann как решение

Решение

Цитата Сообщение от Kasmann Посмотреть сообщение
Исключение выбрасывалось из конструктора, который вызывался внутри try. Соответственно, до catch это исключение не доходило.
Место возникновения исключения не играет роли: хоть в конструкторе, хоть в методе, хоть в геттере или сеттере свойства: если хоть где-то выше по стеку есть try/catch, в котором этот код, то исключение перехватится.
Вот наоборот может быть: конструктор вызывался за пределами try, потому исключение и не перехватывалось.

Если у вас проект такой маленький, что умещается в один файл, то верните все к нерабочему состоянию и выложите сюда весь код — скажем точно, в чем была проблема, т.к. та причина, которую вы назвали выше — не может быть правильной.
Не хочется, чтобы вы уходили отсюда с заблуждениями
1
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,542
19.07.2016, 04:39 13
Мне кажется, что тут всё просто:
Цитата Сообщение от Kasmann Посмотреть сообщение
оно так и выбрасывается - в теле if() без try/catch. Как и некоторые другие исключения
0
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 15
19.07.2016, 07:28  [ТС] 14
kolorotur, уже значительно позже своего последнего вам ответа я нашла ошибки в логике создания и использования экземпляров класса, в ктр выбрасывается необработанное исключение. Спасибо вам за помощь!
0
19.07.2016, 07:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2016, 07:28
Помогаю со студенческими работами здесь

Отмена нажатия клавиши в Console Application
Можно ли отменить нажатие одной клавиши (например, W), если нажата другая клавиша (например, S) в...

Как примерно реализовать CheatManager (Console Application)
Добрый день, я пишу свой игровой движок, и мне надо ещё реализовать CheatManager. Но я не знаю как...

Обработка исключений в классах для пользовательских типов
Здорова господа! Запустил токо класс String тестю и тут у меня вылетело исключение выход за...

Обработка нажатия клавиш (Win32 Console Application)
товарищи,помогите нубу!надо написать прогу в консоли на visual studio на c++.Сама прога то простая...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru