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

Как правильно реализовать исключения в классе

18.04.2020, 17:14. Показов 727. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, какой вариант реализации класса, для данной задачи будет лучше:
Или напишите свой, более правильный вариант.
Спасибо.

Вариант 1:

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
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Person person = new Person("Alex", 19);
                Console.WriteLine($"Имя - {person.GetName()}, Возраст - {person.GetAge()}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
    class Person
    {
        string Name { get; set; }
        int Age { get; set; }
 
        public Person(string Name, int Age)
        {
            if (Name.Count() < 1) { throw new Exception("Имя содержит больше 1-ой буквы."); } else { this.Name = Name; }
            if (Age < 18) { throw new Exception("Возраст больше 18-ти."); } else { this.Age = Age; }
        }
        public string GetName() { return Name; }
        public int GetAge() { return Age; }
    }
Вариант 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
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Person person = new Person("Alex", 19);
                Console.WriteLine($"Имя - {person.LName}, Возраст - {person.LAge}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
    class Person
    {
        public string LName;
        string Name { get { return LName; } set { if (value.Count() < 1) { throw new Exception("Имя содержит больше 1-ой буквы."); } else { LName = value; } } }
        public int LAge;
        int Age { get { return LAge; } set { if (value < 18) { throw new Exception("Вход с 18 лет."); } else { LAge = value; } } }
 
        public Person(string Name, int Age)
        {
            this.Name = Name;
            this.Age = Age;
        }       
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2020, 17:14
Ответы с готовыми решениями:

Как правильно вызывать исключения?
как правильно вызывать исключения? я вот пишу например так: throw std::exception(&quot;Error!&quot;); исключение то выбрасывается, но сообщение...

Как правильно использование исключения?
1. В каких случаях необходимо использовать исключения? 2. Правильно ли я использую исключение в данном случае? Правильно ли выбрано место...

Try Exept, как правильно обработать некоторые исключения?
Всем здрасте. Есть фунция, которая отсылает в телеграм картинку и ждет пока я пришлю в ответ текст с нее. Я поместил функцию в блок try, а...

4
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
19.04.2020, 13:07
Оба варианта видятся мне некорректными.
Просто даже не совсем логично, что создавая пользователя, может быть выброшено исключение, потому что есть ограничения по возрасту.
Может есть смысл сделать некий валидатор, который сначала проверить входные данные и если они корректны, то создаст пользователя?

Ваш второй вариант построен неверно (даже без исключений). Публичными должны быть геттеры и сеттеры, которые устанавливают значения для приватных данных, а у вас наоборот всё. Можно установить любой возраст и пустое имя просто через публичные поля LName и LAge.
2
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 180
19.04.2020, 15:19  [ТС]
Можно проверять данные на стороне клиента с помощью валидатора.
Можно проверять данные на стороне сервера, сразу при их получении.
Это все понятно.

На счет второго вариант согласен.

Но вопрос был именно через модель пользователя, как лучше это реализовать.

Добавлено через 5 минут
Третий вариант может?

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
class Person
{
    public string Name { get; set; }
    private int age;
    public int Age
    {
        get { return age; }
        set
        {
            if (value < 18)
                throw new PersonException("Лицам до 18 регистрация запрещена", value);
            else
                age = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        try
        {
            Person p = new Person { Name = "Tom", Age = 13 };
        }
        catch (PersonException ex)
        {
            Console.WriteLine($"Ошибка: {ex.Message}");
            Console.WriteLine($"Некорректное значение: {ex.Value}");
        }
        Console.Read();
    }
}
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
19.04.2020, 15:33
Цитата Сообщение от Леонид Каруна Посмотреть сообщение
Но вопрос был именно через модель пользователя, как лучше это реализовать.
Я конечно могу ошибаться, но данной логике в модели пользователя не место. Но если очень хочется, тогда любой ваш вариант с выбросом исключения в конструкторе подойдёт по сути.
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
19.04.2020, 19:23
Леонид Каруна,
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
41
42
43
44
45
46
47
48
49
class Person
{
    private string _name;
    private int _age;
 
    public string Name 
    { 
        get => _name;
        private set 
        {
            if (string.IsNullOrWhitespace(value))
                throw new ArgumentException();
 
            _name = value;
        }
    }
 
    public int Age
    {
        get => _age; 
        set
        {
            if (value < 18)
                throw new PersonException("Лицам до 18 регистрация запрещена", value);
           
            age = _value;
        }
    }
 
    public Person(string name, int age)
    {
        Name = name;
        Age    = age;
    }
 
    public Person ChangeName(string name)
    {
        Name = name;
 
        return this;
    }  
 
    public Person IncreaseAge()
    {
        Age += 1;
 
        return this;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2020, 19:23
Помогаю со студенческими работами здесь

Исключения в классе
Есть некий класс рациональных чисел. Как прописать исключение, для работы следующего теста: class Fraction(): __slots__ =...

Как правильно завершить поток без исключения ThreadInterruptedException?
В общем, есть отдельный проект dll-ки с компонентом, наследующим MonthCalendar. В нем дополнительно хранятся заметки, есть возможность...

Исключения в своем классе
Приветствую всех. Создаю свой класс. В нем есть общедоступная функция, через которую в класс заносятся данные. Параметр функции - это...

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

Поле Unique. Как правильно написать обработку исключения в RowValidating
Когда заношу значение в ячейку DataGridView которая привязана к unique полю в базе возникает исключение при валидации строки грида. Как...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru