throw и try-catch - что это и зачем нужно?
из лекций в вузе поняла, что блок try-catch нужен для отлавливания исключений, но так ли это? И зачем тогда throw? Почему нельзя использовать простую обработку исключений?
Зачем они нужны, если можно спокойно найти ошибку дебаггером и использовать обработку исключений?
Ответы (2 шт):
Из документации Microsoft learn
Операторы
throwиtryиспользуются для работы с исключениями. Используйте операторthrow, чтобы создать исключение. Используйте инструкцию для перехватаtryи обработки исключений, которые могут возникнуть во время выполнения блока кода.
Когда возникает критическая или неожиданная ситуация, программа может сгенерировать исключение с помощью оператора throw. Это позволяет передать управление к месту, где исключение будет обработано.
Оператор throw принимает в качестве аргумента объект-исключение, который может быть любым типом, но обычно это класс, производный от базового класса std::exception. Объект-исключение содержит информацию о типе ошибки или необычной ситуации.
Исключение может быть перехвачено и обработано с помощью блока try-catch. Блок try содержит код, который может вызвать исключение, а блок catch содержит код, который обрабатывает исключение. Если в блоке try возникает исключение, выполнение кода в этом блоке прерывается, и выполнение переходит в соответствующий блок catch, соответствующий типу исключения.
В общем говоря, практика отлова ошибок позволяет повысить устойчивость программы от непредвиденных обстоятельств. Создание собственных ошибок - буквально вклад в будущее, читая огромный модуль, в котором есть ошибка, мы можем сразу понять в каком месте она была вызвана, чтобы начать анализировать конкретно это место.
Что-бы чутка въехать в разного рода исключения, можно рассмотреть к примеру такой код. Где разные условия исключений создают разное поведение программы.
При этом исключения в отличии от флагов, тебе позволяют их отлавливать на разных уровнях приложения. Не только внутри тела одной функции но и раздельно по классам. К примеру если отвалился 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;
}