throw и try-catch - что это и зачем нужно?

Рейтинг: -2Ответов: 2Опубликовано: 13.06.2023

из лекций в вузе поняла, что блок try-catch нужен для отлавливания исключений, но так ли это? И зачем тогда throw? Почему нельзя использовать простую обработку исключений? Зачем они нужны, если можно спокойно найти ошибку дебаггером и использовать обработку исключений?

Ответы

▲ 0Принят

Из документации Microsoft learn

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

Когда возникает критическая или неожиданная ситуация, программа может сгенерировать исключение с помощью оператора throw. Это позволяет передать управление к месту, где исключение будет обработано.

Оператор throw принимает в качестве аргумента объект-исключение, который может быть любым типом, но обычно это класс, производный от базового класса std::exception. Объект-исключение содержит информацию о типе ошибки или необычной ситуации.

Исключение может быть перехвачено и обработано с помощью блока try-catch. Блок try содержит код, который может вызвать исключение, а блок catch содержит код, который обрабатывает исключение. Если в блоке try возникает исключение, выполнение кода в этом блоке прерывается, и выполнение переходит в соответствующий блок catch, соответствующий типу исключения.

В общем говоря, практика отлова ошибок позволяет повысить устойчивость программы от непредвиденных обстоятельств. Создание собственных ошибок - буквально вклад в будущее, читая огромный модуль, в котором есть ошибка, мы можем сразу понять в каком месте она была вызвана, чтобы начать анализировать конкретно это место.

▲ 1

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

При этом исключения в отличии от флагов, тебе позволяют их отлавливать на разных уровнях приложения. Не только внутри тела одной функции но и раздельно по классам. К примеру если отвалился SQL в базу, то всё в порядке просто грохаем сам запрос. А если отвалилось всё соединение с базой то это совсем другой разговор. Там надо принимать кардинальные меры и перезапускать соединение по новой.

// Online C++ compiler to run C++ program online
#include <exception>
#include <iostream>

class ThisWillStopOnlyLocal: public std::exception {
public:
    char const * what() const noexcept override {
        return "Custom C++ Exception";
    }
};

class ThisWillStopAll: public std::exception {
public:
    char const * what() const noexcept override {
        return "Custom C++ Exception";
    }
};

int main() {
    int input;
    try {
        try {
            std::cout << "Input 1, 2 or other number: ";
            std::cin >> input;
            switch (input) {
            case 1: throw ThisWillStopOnlyLocal{};
            case 2: throw ThisWillStopAll{};
            }
            std::cout << "everything fine" << std::endl;
        } catch (ThisWillStopOnlyLocal const & e) {
            std::cout << "only subrequest dead" << std::endl;
        }
        std::cout << "step 2 will continue" << std::endl;
    } catch (ThisWillStopAll const & e) {
        std::cout << "everything was dead" << std::endl;
    }
    return 0;
}