Обработка ошибок
Какие конструкции используют при обработке exception?
При обработке исключений в C++ используются следующие конструкции:
-
try:- Блок кода, в котором могут возникнуть исключения.
try { // Код, который может вызвать исключение } -
catch:-
Блок кода для обработки исключений.
-
Перехватывает и обрабатывает исключения, выброшенные в блоке
try.
catch (const std::exception& e) { // Обработка исключения } -
-
throw:- Оператор для генерации исключения.
throw std::runtime_error("Ошибка");
try {
// Код, который может вызвать исключение
throw std::runtime_error("Ошибка");
} catch (const std::exception& e) {
// Обработка исключения
std::cout << "Исключение: " << e.what() << std::endl;
}
Как отловить деление на 0 в С++?
Для отлова деления на 0 в C++ можно использовать обработку исключений с конструкциями try, catch, и выбросом исключения throw. Поскольку стандартное деление на ноль для целых чисел не генерирует исключение, нужно явно проверять делитель и выбрасывать исключение при делении на 0.
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Деление на ноль!");
}
return a / b;
}
int main() {
try {
int result = divide(10, 0);
std::cout << "Результат: " << result << std::endl;
} catch (const std::exception& e) {
std::cout << "Ошибка: " << e.what() << std::endl;
}
return 0;
}
Можно ли выбрасывать exception с деструктора?
Исключение может возникнуть внутри деструктора, но обычно его следует обработать там же. Если оно выходит из noexcept-деструктора, вызывается std::terminate. Если деструктор выпускает исключение во время раскрутки стека из-за другого исключения, также вызывается std::terminate. Это определённое стандартом завершение, а не неопределённое поведение.
Правильный подход:-
Обрабатывать все возможные исключения внутри деструктора и не позволять им выходить за его пределы.
-
Если требуется сообщить об ошибке, использовать другие механизмы, такие как логирование или флаги ошибок.
class MyClass {
public:
~MyClass() {
try {
// Код, который может вызвать исключение
} catch (...) {
// Обработка исключения, например, логирование
}
}
};