Skip to content

Instantly share code, notes, and snippets.

@NickTikhomirov
Last active June 19, 2019 18:51
Show Gist options
  • Save NickTikhomirov/3de1749ed79edea7ed5370d848b793fc to your computer and use it in GitHub Desktop.
Save NickTikhomirov/3de1749ed79edea7ed5370d848b793fc to your computer and use it in GitHub Desktop.
Исключения

Вопросы 19-26, Исключения

Автор: Толик

Головной раздел: Меню

Вопрос 19. Понятие особой (исключительной) ситуации в Си++. Общий формат обработки исключительных ситуаций (ключевые слова: try, catch, throw).

Исключительная ситуация - тот момент, когда дальнейшее выполнение программы невозможно.

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

  1. Создается статическая переменная со значением, заданным в операторе throw. Она будет существовать до тех пор, пока исключение не будет обработано. Если переменная-исключение является объектом класса, при ее создании работает конструктор копирования.
  2. Завершается выполнение защищенного try-блока: раскручивается стек подпрограмм, вызываются деструкторы для тех объектов, время жизни которых истекает и т.д.
  3. Выполняется поиск первого из catch-блоков, который пригоден для обработки созданного исключения.

Общий формат описан ниже

__________________________________________________________________

Вопрос 20. Обработка исключения внутри функции, в которой сгенерировано исключение (ключевые слова: try, catch, throw), пример.

void exceptionFunction()
{
    try {
        // Что-то делаем и вдруг
        throw std::length_error("Text");
    } catch (std::length_error &e) {
        std::cout << "Captured" << std::endl;
    }
}

__________________________________________________________________

Вопрос 21. Обработка исключения вне функции, в которой сгенерировано исключение, объявление функции, в которой генерируются исключения (ключевые слова: try, catch, throw), пример.

void exceptionFunction()
{
    // Что-то делаем
    // Возможна генерация std::length_error, std::out_of_range и каких-либо других исключений, 
    //          надклассом которых является std::exception
}

int main()
{
    try {
        exceptionFunction();
    } catch (std::length_error &e) {
        std::cout << "Length error: " << e.what() << std::endl;
    } catch (std::out_of_range &e) {
        std::cout << "Out of range: " << e.what() << std::endl;
    } catch (std::exception &e) {
        std::cout << "Other exception: " << e.what() << std::endl;
    }
}

__________________________________________________________________

Вопрос 22. Создание исключения как объекта класса в Си++ (ключевые слова: try, catch, throw), пример.

std::length_error("Text");       // Создание исключения как объекта класса

try обозначает начало блока с возможным выборосом исключения

catch( ) обозначает начало блока с обработкой исключений

throw выкидывает исключение

__________________________________________________________________

Вопрос 23. Формы обработчиков исключений (catch), примеры.

catch (std::exception &e)       // Ловим определенное исключение по его классу или надклассу
catch (...)         // Ловим любое исключение

Также никто не запрещает бросать вместо исключения какой-нибудь int или std::mutex. Соответственно, для их ловли второй вариант подходит без изменений, а в первом придётся заменить тип.

__________________________________________________________________

Вопрос 24. Формы выражений генерации исключений в Си++ (throw), примеры.

throw std::out_of_range("Информативная информация");        // Выкидывание
// Перешлет существующее исключение, либо
// SIGABRT приведет к аварийному закрытию программы
throw;

__________________________________________________________________

Вопрос 25. Обработка исключений в стандартной библиотеке Си++: обзор основных классов

Надклассы

Класс Описание
std::exception Базовый класс
std::runtime_error Ошибка времени выполнения
std::logic_error Логическая ошибка

Некоторые из исключений

Класс Описание
std::out_of_range Выход за границу
std::length_error Нарушен предел длины
std::bad_alloc Не смогли аллоцировать память
std::bad_cast Ошибка преобразования ссылок в dynamic_cast

Дерево

__________________________________________________________________

Вопрос 26. Обработка исключений в стандартной библиотеке Си++: создание своего класса исключения на основе класса std::exception, пример.

Обработка исключений производится с помощью конструкции try { ... } catch ( ... ) { ... }

// Свое исключение
class MyException: public std::exception
{
public:
    const char *what() const noexcept override
    {
        return "My exception raised!";
    }
};

// Где-то в коде
try {
    myFunction();   // Пусть эта функция может выбросить MyException
} catch (const MyException &e) {
    // Либо можно ловить ``const std::exception &e`` так как это надкласс
    std::cout << e.what() << std::endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment