Автор: Толик
Головной раздел: Меню
Вопрос 19. Понятие особой (исключительной) ситуации в Си++. Общий формат обработки исключительных ситуаций (ключевые слова: try, catch, throw).
Исключительная ситуация - тот момент, когда дальнейшее выполнение программы невозможно.
Обработка исключений, возбужденных оператором throw, идет по следующей схеме:
- Создается статическая переменная со значением, заданным в операторе throw. Она будет существовать до тех пор, пока исключение не будет обработано. Если переменная-исключение является объектом класса, при ее создании работает конструктор копирования.
- Завершается выполнение защищенного try-блока: раскручивается стек подпрограмм, вызываются деструкторы для тех объектов, время жизни которых истекает и т.д.
- Выполняется поиск первого из 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
выкидывает исключение
catch (std::exception &e) // Ловим определенное исключение по его классу или надклассу
catch (...) // Ловим любое исключение
Также никто не запрещает бросать вместо исключения какой-нибудь int или std::mutex. Соответственно, для их ловли второй вариант подходит без изменений, а в первом придётся заменить тип.
throw std::out_of_range("Информативная информация"); // Выкидывание
// Перешлет существующее исключение, либо
// SIGABRT приведет к аварийному закрытию программы
throw;
Класс | Описание |
---|---|
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;
}