Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Типы исключительных ситуаций и процесс их обработки”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Слайды
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Регистрация в JupyterHub
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Формы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
      • Практика
        • Программное обеспечение
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Обзор базовых конструкций и основных элементов языка”
        • Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
        • Лаб. работа “Типы исключительных ситуаций и процесс их обработки”
        • Лаб. работа “Потоки ввода/вывода и работа с файлами”
        • Лаб. работа “Организация потоков, параллельной обработки, синхронизации и распределённой обработки синхронизуемых участков кода”
        • Лаб. работа “Структурные механизмы языка программирования для реализации полиморфизма в программах”
        • Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”
        • Лаб. работа “Библиотеки и средства внедрения визуальных компонент для организации GUI-интерфейсов пользователя. Обработка событий”
        • Лаб. работа “Концепция распределённой обработки данных и технологии удалённой обработки данных”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Слайды
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Линейное программирование”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Слайды
      • Слайды
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Цель работы
  • Теоретические сведения
    • Понятие исключительной ситуации
    • Иерархия стандартных исключений C++
    • Синтаксис try-catch
    • Пользовательские исключения
    • Генерация исключений при парсинге
  • Задание для выполнения
    • Требования к программе
    • Пример ожидаемого вывода
  • Индивидуальные задания
    • Вариант 1. Валидация DNS-записей
    • Вариант 2. Обработка FTP-команд
    • Вариант 3. Парсинг HTTP-заголовков
    • Вариант 4. Проверка почтовых адресов
    • Вариант 5. Обработка конфигурации сервера
    • Вариант 6. Валидация формата данных
    • Вариант 7. Аутентификация пользователей
    • Вариант 8. Обработка SQL-запросов
    • Вариант 9. Работа с SSH-подключениями
    • Вариант 10. Валидация REST API-запросов
    • Вариант 11. Обработка WebSocket-сообщений
    • Вариант 12. Сетевой сканер (имитация)
    • Вариант 13. Работа с сертификатами
    • Вариант 14. Обработка ICMP-пакетов
    • Вариант 15. Маршрутизация пакетов
    • Вариант 16. Обработка JSON-конфигурации
    • Вариант 17. Работа с прокси-сервером
    • Вариант 18. Обработка сетевых событий
    • Вариант 19. Работа с сетевым кэшем
    • Вариант 20. Обработка XML-конфигурации
  • Порядок выполнения
  • Контрольные вопросы
  • Содержание отчёта
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Типы исключительных ситуаций и процесс их обработки”

Лаб. работа “Типы исключительных ситуаций и процесс их обработки”

Программирование сетевых приложений
Практика
Автор

Бизюк Андрей

Дата публикации

9 апреля 2026 г.

Цель работы

Изучить механизм обработки исключительных ситуаций в C++ (try-catch) путём разработки консольного приложения, имитирующего отправку данных по сети. Освоить перехват и обработку стандартных исключений при парсинге входных данных и при сшибках на этапе «отправки».

Теоретические сведения

Понятие исключительной ситуации

Исключение — это ситуация, возникающая во время выполнения программы, которая нарушает нормальный ход её работы. Механизм обработки исключений позволяет отделить код обнаружения ошибки от кода её обработки.

Иерархия стандартных исключений C++

Иерархия стандартных исключений C++

Иерархия стандартных исключений C++

Синтаксис try-catch

try {
    // код, который может вызвать исключение
    if (port < 0 || port > 65535)
        throw std::out_of_range("Порт вне диапазона 0-65535");
} catch (const std::out_of_range& e) {
    cerr << "Ошибка диапазона: " << e.what() << endl;
} catch (const std::exception& e) {
    cerr << "Ошибка: " << e.what() << endl;
} catch (...) {
    cerr << "Неизвестная ошибка" << endl;
}

Пользовательские исключения

class NetworkException : public std::runtime_error {
private:
    int errorCode;
public:
    NetworkException(const string& msg, int code)
        : runtime_error(msg), errorCode(code) {}
    int getErrorCode() const { return errorCode; }
};

class ConnectionRefusedException : public NetworkException {
public:
    ConnectionRefusedException(const string& ip, int port)
        : NetworkException("Соединение отклонено: " + ip + ":" + to_string(port), 10061) {}
};

class TimeoutException : public NetworkException {
private:
    int timeoutMs;
public:
    TimeoutException(int ms)
        : NetworkException("Таймаут соединения: " + to_string(ms) + "мс", 10060), timeoutMs(ms) {}
    int getTimeout() const { return timeoutMs; }
};

Генерация исключений при парсинге

#include <stdexcept>

int parsePort(const string& input) {
    if (input.empty())
        throw std::invalid_argument("Пустая строка");
    for (char c : input) {
        if (!isdigit(c))
            throw std::invalid_argument("Порт должен содержать только цифры: " + input);
    }
    int port = stoi(input);
    if (port < 1 || port > 65535)
        throw std::out_of_range("Порт вне диапазона 1-65535: " + to_string(port));
    return port;
}

Задание для выполнения

Разработать консольное приложение, имитирующее отправку данных по сети с обработкой стандартных и пользовательских исключений.

Требования к программе

  1. Создать пользовательские классы исключений (наследники std::runtime_error):

    • NetworkException — базовое сетевое исключение, содержит код ошибки (int)
    • ConnectionRefusedException — соединение отклонено (IP + порт)
    • TimeoutException — таймаут соединения (значение таймаута в мс)
    • DataFormatException — неверный формат данных (описание ошибки)
    • AuthenticationException — ошибка аутентификации (имя пользователя)
  2. Реализовать функции с генерацией исключений:

    • int parsePort(const string& input) — парсинг порта: проверка на цифры, диапазон 1–65535
    • string parseIpAddress(const string& input) — проверка формата IP (4 октета, 0–255)
    • void validateCredentials(const string& login, const string& password) — проверка: длина логина ≥ 3, длина пароля ≥ 6, пароль содержит цифру
    • void simulateSend(const string& ip, int port, const string& data, int timeout) — имитация отправки: случайным образом генерирует исключения ConnectionRefusedException (вероятность 20%), TimeoutException (15%), DataFormatException (10%). Если ошибок нет — выводит сообщение об успешной отправке.
  3. Реализовать текстовое меню:

    1. Отправить данные (полный цикл: парсинг → валидация → отправка)
    2. Проверить формат IP-адреса
    3. Проверить учётные данные
    4. Демо всех типов исключений
    0. Выход
  4. В пункте 1 пользователь вводит IP, порт, логин, пароль, данные, таймаут. Программа последовательно вызывает функции парсинга и отправки. Каждое исключение обрабатывается с выводом информативного сообщения, при этом выполнение не прерывается — пользователь возвращается в меню.

Пример ожидаемого вывода

=== Отправка данных ===
IP-адрес: 192.168.1.300
Ошибка: IP-адрес некорректен: октет 300 вне диапазона 0-255

IP-адрес: 192.168.1.1
Порт: abc
Ошибка: Порт должен содержать только цифры: abc

Порт: 8080
Логин: ab
Ошибка: Длина логина должна быть не менее 3 символов

Логин: admin
Пароль: qwerty
Ошибка: Пароль должен содержать хотя бы одну цифру

Пароль: qwerty1
Данные: Hello Server
Таймаут (мс): 5000
[ОК] Данные отправлены на 192.168.1.1:8080 (протокол TCP, 11 байт, 5мс)

=== Демо исключений ===
[ConnectionRefused] Соединение отклонено: 10.0.0.1:80 (код: 10061)
[Timeout] Таймаут соединения: 30000мс (код: 10060)
[DataFormat] Неверный формат пакета: отсутствует заголовок

Индивидуальные задания

Каждый вариант предполагает разработку консольного приложения на C++ с собственными классами исключений (наследники std::runtime_error), функциями валидации и имитации сетевых операций, а также текстовым меню с полной обработкой исключений через try-catch.

Вариант 1. Валидация DNS-записей

Исключения: DNSException (код ошибки), InvalidDomainException (домен), InvalidIPException (IP), RecordNotFoundException (домен). Функции: parseDomain(name) — проверка формата домена, parseIP(ip) — проверка октетов 0–255, lookupRecord(domain) — имитация поиска (20% — RecordNotFoundException), addRecord(domain, ip) — добавление записи.

Пункт меню Функция Возможные исключения
1. Найти запись lookupRecord(domain) RecordNotFoundException, InvalidDomainException
2. Добавить запись addRecord(domain, ip) InvalidDomainException, InvalidIPException
3. Проверить домен parseDomain(name) InvalidDomainException
4. Проверить IP parseIP(ip) InvalidIPException
5. Демо исключений — все типы

Вариант 2. Обработка FTP-команд

Исключения: FTPException (базовое, код ошибки), FileNotFoundException, PermissionDeniedException, DiskFullException.

Пункт меню Функция Возможные исключения
1. Загрузить файл simulateUpload(filename, size) FileNotFoundException, PermissionDeniedException, DiskFullException
2. Скачать файл simulateDownload(filename) FileNotFoundException, PermissionDeniedException
3. Удалить файл validateFilename(name) FileNotFoundException, PermissionDeniedException
4. Список файлов parsePath(path) invalid_argument
5. Демо исключений — все типы

Вариант 3. Парсинг HTTP-заголовков

Исключения: HTTPException (базовое, код ошибки), InvalidURLException, InvalidHeaderException, TimeoutException.

Пункт меню Функция Возможные исключения
1. Отправить запрос simulateRequest(url) InvalidURLException, TimeoutException
2. Парсинг URL parseURL(url) InvalidURLException
3. Проверить заголовок parseHeader(header) InvalidHeaderException
4. Проверить код ответа validateStatusCode(code) out_of_range, invalid_argument
5. Демо исключений — все типы

Вариант 4. Проверка почтовых адресов

Исключения: MailException (базовое, код ошибки), InvalidEmailException, AttachmentTooLargeException, RecipientNotFoundException.

Пункт меню Функция Возможные исключения
1. Отправить письмо simulateSendEmail(from, to, subject) InvalidEmailException, RecipientNotFoundException, AttachmentTooLargeException
2. Проверить email validateEmail(email) InvalidEmailException
3. Проверить вложение validateAttachment(filename, size) AttachmentTooLargeException
4. Парсинг получателей parseRecipientList(list) InvalidEmailException
5. Демо исключений — все типы

Вариант 5. Обработка конфигурации сервера

Исключения: ConfigException (базовое, код ошибки), MissingKeyException, InvalidValueException, DuplicateKeyException.

Пункт меню Функция Возможные исключения
1. Загрузить конфиг loadConfig(filename) MissingKeyException, InvalidValueException, DuplicateKeyException
2. Проверить порт validatePort(port) InvalidValueException
3. Проверить IP validateIP(ip) InvalidValueException
4. Добавить параметр parseConfigLine(line) InvalidValueException, DuplicateKeyException
5. Демо исключений — все типы

Вариант 6. Валидация формата данных

Исключения: DataException (базовое, код ошибки), InvalidFormatException, ChecksumException, CorruptedException.

Пункт меню Функция Возможные исключения
1. Парсинг пакета parsePacket(data) InvalidFormatException, CorruptedException
2. Проверка контрольной суммы validateChecksum(data, expected) ChecksumException
3. Сериализация serializePacket(packet) InvalidFormatException
4. Валидация формата parseDataFormat(data) InvalidFormatException
5. Демо исключений — все типы

Вариант 7. Аутентификация пользователей

Исключения: AuthException (базовое, код ошибки), InvalidCredentialsException, AccountLockedException, SessionExpiredException.

Пункт меню Функция Возможные исключения
1. Войти authenticate(login, password) InvalidCredentialsException, AccountLockedException
2. Проверить логин validateLogin(login) InvalidCredentialsException
3. Проверить пароль validatePassword(password) InvalidCredentialsException
4. Проверить сессию checkSession(userId) SessionExpiredException
5. Демо исключений — все типы

Вариант 8. Обработка SQL-запросов

Исключения: QueryException (базовое, код ошибки), SyntaxErrorException, TableNotFoundException, ConstraintViolationException.

Пункт меню Функция Возможные исключения
1. Выполнить запрос simulateExecute(query) SyntaxErrorException, TableNotFoundException, ConstraintViolationException
2. Парсинг запроса parseQuery(query) SyntaxErrorException
3. Проверить таблицу validateTableName(name) TableNotFoundException
4. Проверить столбец validateColumn(name) ConstraintViolationException
5. Демо исключений — все типы

Вариант 9. Работа с SSH-подключениями

Исключения: SSHException (базовое, код ошибки), HostKeyException, AuthenticationFailedException, ConnectionTimeoutException.

Пункт меню Функция Возможные исключения
1. Подключиться simulateSSHConnect(host, user) HostKeyException, AuthenticationFailedException, ConnectionTimeoutException
2. Проверить хост parseHost(host) invalid_argument
3. Проверить ключ validateKey(key) HostKeyException
4. Проверить порт validatePort(port) out_of_range
5. Демо исключений — все типы

Вариант 10. Валидация REST API-запросов

Исключения: APIException (базовое, код ошибки), InvalidEndpointException, MethodNotAllowedException, RateLimitException.

Пункт меню Функция Возможные исключения
1. Выполнить запрос simulateAPIRequest(method, endpoint, data) InvalidEndpointException, MethodNotAllowedException, RateLimitException
2. Проверить endpoint parseEndpoint(endpoint) InvalidEndpointException
3. Проверить метод validateMethod(method) MethodNotAllowedException
4. Проверить payload validatePayload(payload) invalid_argument
5. Демо исключений — все типы

Вариант 11. Обработка WebSocket-сообщений

Исключения: WSException (базовое, код ошибки), HandshakeFailedException, FrameException, ConnectionClosedException.

Пункт меню Функция Возможные исключения
1. Отправить сообщение simulateSendMessage(data) ConnectionClosedException, FrameException
2. Парсинг фрейма parseFrame(data) FrameException
3. Проверить handshake validateHandshake(headers) HandshakeFailedException
4. Проверить размер validatePayloadSize(size) out_of_range
5. Демо исключений — все типы

Вариант 12. Сетевой сканер (имитация)

Исключения: ScanException (базовое, код ошибки), InvalidRangeException, TimeoutException, PermissionDeniedException.

Пункт меню Функция Возможные исключения
1. Сканировать хост simulateScan(ip, port) TimeoutException, PermissionDeniedException
2. Проверить диапазон IP parseIPRange(range) InvalidRangeException
3. Проверить диапазон портов validatePortRange(start, end) InvalidRangeException, out_of_range
4. Парсинг цели parseTarget(target) InvalidRangeException
5. Демо исключений — все типы

Вариант 13. Работа с сертификатами

Исключения: CertException (базовое, код ошибки), ExpiredException, InvalidChainException, DomainMismatchException.

Пункт меню Функция Возможные исключения
1. Проверить сертификат parseCertificate(data) CertException
2. Проверить срок validateExpiry(date) ExpiredException
3. Проверить домен validateDomain(certDomain, targetDomain) DomainMismatchException
4. Проверить цепочку checkChain(certs) InvalidChainException
5. Демо исключений — все типы

Вариант 14. Обработка ICMP-пакетов

Исключения: PingException (базовое, код ошибки), HostUnreachableException, TTLExceededException, PacketTooBigException.

Пункт меню Функция Возможные исключения
1. Пинг хоста simulatePing(host, count) HostUnreachableException, TTLExceededException, PacketTooBigException
2. Проверить IP parseIPAddress(ip) invalid_argument
3. Проверить TTL validateTTL(ttl) TTLExceededException
4. Проверить размер пакета validatePacketSize(size) PacketTooBigException
5. Демо исключений — все типы

Вариант 15. Маршрутизация пакетов

Исключения: RouteException (базовое, код ошибки), NoRouteException, InvalidMaskException, GatewayUnavailableException.

Пункт меню Функция Возможные исключения
1. Маршрутизация simulateRoute(destIP) NoRouteException, GatewayUnavailableException
2. Парсинг маршрута parseRouteEntry(entry) InvalidMaskException, invalid_argument
3. Проверить маску validateMask(mask) InvalidMaskException
4. Проверить шлюз validateGateway(ip) GatewayUnavailableException
5. Демо исключений — все типы

Вариант 16. Обработка JSON-конфигурации

Исключения: JSONException (базовое, код ошибки), ParseErrorException, MissingFieldException, TypeMismatchException.

Пункт меню Функция Возможные исключения
1. Загрузить конфиг loadServerConfig(json) ParseErrorException, MissingFieldException, TypeMismatchException
2. Получить поле getField(json, key) MissingFieldException, ParseErrorException
3. Проверить тип validateType(value, expectedType) TypeMismatchException
4. Парсинг JSON parseJSON(json) ParseErrorException
5. Демо исключений — все типы

Вариант 17. Работа с прокси-сервером

Исключения: ProxyException (базовое, код ошибки), ProxyAuthException, BlockedHostException, ConnectionRefusedException.

Пункт меню Функция Возможные исключения
1. Запрос через прокси simulateProxyRequest(proxy, target) ProxyAuthException, BlockedHostException, ConnectionRefusedException
2. Проверить адрес прокси parseProxyAddress(address) invalid_argument
3. Проверить URL validateTargetURL(url) BlockedHostException
4. Проверить чёрный список checkBlocklist(domain) BlockedHostException
5. Демо исключений — все типы

Вариант 18. Обработка сетевых событий

Исключения: EventException (базовое, код ошибки), InvalidEventException, QueueFullException, HandlerNotFoundException.

Пункт меню Функция Возможные исключения
1. Опубликовать событие simulatePublishEvent(type, data) InvalidEventException, QueueFullException, HandlerNotFoundException
2. Парсинг события parseEvent(data) InvalidEventException
3. Проверить тип validateEventType(type) InvalidEventException
4. Проверить очередь validateQueueSize(size) QueueFullException
5. Демо исключений — все типы

Вариант 19. Работа с сетевым кэшем

Исключения: CacheException (базовое, код ошибки), KeyNotFoundException, CacheFullException, SerializationException.

Пункт меню Функция Возможные исключения
1. Получить значение simulateGet(key) KeyNotFoundException, SerializationException
2. Сохранить значение simulatePut(key, value) CacheFullException, SerializationException
3. Проверить ключ validateKey(key) invalid_argument
4. Проверить размер кэша validateCacheSize(size) CacheFullException
5. Демо исключений — все типы

Вариант 20. Обработка XML-конфигурации

Исключения: XMLException (код ошибки), TagNotFoundException (тег), AttributeFormatException (атрибут), NestingException (уровень вложенности). Функции: parseTag(xml, tagName) — поиск открывающего и закрывающего тега, validateAttribute(value, type) — проверка типа значения (int/string/bool), parseConfig(xml) — парсинг конфигурации (30% — TagNotFoundException), validateStructure(xml) — проверка баланса тегов. Меню: 1. Загрузить конфигурацию, 2. Получить значение тега, 3. Проверить атрибут, 4. Проверить структуру, 5. Демо исключений, 0. Выход.


Порядок выполнения

  1. Создать проект C++ в Qt Creator (CMake).
  2. Определить иерархию пользовательских исключений.
  3. Реализовать функции парсинга и валидации с генерацией исключений.
  4. Реализовать функцию имитации отправки simulateSend().
  5. Реализовать меню с полной обработкой исключений через try-catch блоки.
  6. Протестировать: ввести корректные и некорректные данные, убедиться в обработке всех типов исключений.
  7. Скомпилировать, запустить, сохранить скриншоты.

Контрольные вопросы

  1. Что такое исключение и зачем нужен механизм обработки исключений?
  2. Какие стандартные классы исключений вы использовали? В чём разница между logic_error и runtime_error?
  3. Что делает оператор throw? Можно ли бросать исключение любого типа?
  4. Что произойдёт, если исключение не перехватить ни одним блоком catch?
  5. Зачем нужен блок catch(...) и когда его следует использовать?
  6. Какой порядок выполнения блоков catch при наследовании исключений? Почему важен порядок?
  7. Что такое e.what() и какую информацию он возвращает?
  8. Чем создание пользовательского класса исключения лучше генерации std::runtime_error("текст")?
  9. В чём разница между обработкой ошибок через исключения и через коды возврата?

Содержание отчёта

  1. Тема, цель и задание лабораторной работы.
  2. Диаграмма иерархии пользовательских исключений.
  3. Текст программы с комментариями.
  4. Скриншоты: успешная отправка, обработка каждого типа исключения.
  5. Ответы на контрольные вопросы.
Наверх
Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
Лаб. работа “Потоки ввода/вывода и работа с файлами”